研究runtime一段時(shí)間后亡哄,發(fā)現(xiàn)runtime的運(yùn)用其實(shí)很廣泛。一個(gè)功能的實(shí)現(xiàn)也有很多種方法樟氢,主要是看我們是否會(huì)運(yùn)用所掌握的知識(shí)解愤。
以前遇到過(guò)镇饺,從服務(wù)器獲取一部分?jǐn)?shù)據(jù)展示一個(gè)輪播圖。點(diǎn)擊輪播圖中不同的圖片進(jìn)入到不同的界面送讲。像這樣:
- 首先想到的寫(xiě)法是奸笤,根據(jù)參數(shù)寫(xiě)if else判斷進(jìn)入哪個(gè)類,然后進(jìn)行創(chuàng)建哼鬓、跳轉(zhuǎn)监右。
- 學(xué)習(xí)runtime后,我們可以根據(jù)類名獲取一個(gè)類异希,像這樣:
Class newClass = objc_getClass(className);
那我們就可以讓服務(wù)器把類名傳給我們健盒,我們直接通過(guò)類名獲取到對(duì)應(yīng)的類,進(jìn)行跳轉(zhuǎn)即可称簿。不需要if else判斷扣癣,所有的類都統(tǒng)一處理。
// 這個(gè)規(guī)則肯定事先跟服務(wù)端溝通好憨降,跳轉(zhuǎn)對(duì)應(yīng)的界面需要對(duì)應(yīng)的參數(shù)
NSDictionary *userInfo = @{
@"class": @"PushViewController",//類名
@"alertStr": @"要提示的內(nèi)容"http://這個(gè)類需要的參數(shù)
};
const char * className = [userInfo[@"class"] cStringUsingEncoding:NSASCIIStringEncoding];
Class newClass = objc_getClass(className);
if (!newClass) {//如果沒(méi)有這個(gè)類父虑,進(jìn)行創(chuàng)建
Class newClass = objc_allocateClassPair([UIViewController class],className , 0);
objc_registerClassPair(newClass);
}
//傳遞至給newClass
id instance = [[newClass alloc] init];
[instance setValue:userInfo[@"alertStr"] forKey:@"alertStr"];
// 跳轉(zhuǎn)到對(duì)應(yīng)的控制器
[self.navigationController pushViewController:instance animated:YES];