? ? ? ?之前項目中有根據后臺數據執行不同代碼,根據不同的字符串返回不同UIViewController對象,最開始需要的vc 種類不多我用的是if else 做字符串比較再執行不同代碼,但是如果需求的vc 有幾十個,需要的恰好是最后一個呢?這樣if else if 代碼看起來混亂并且消耗資源。
?其實我們可以有兩種方法解決類似的判斷問題,
1,使用注冊機制。
2,直接使用網絡中的字符串調用方法。
一,注冊機制,我們只需要把代碼通過相應的字符串放入字典中,根據字符串取出相應的代碼運行得到結果,iOS中我們直接使block 存儲相應代碼。如下通過過for循環把不通的vc放入字典,
_dic=[[NSMutableDictionaryalloc]initWithCapacity:_arr.count];
for(int i =0; i <_arr.count; i++) {
NSString*key = [NSString ?stringWithFormat:@"%d",i];
UIViewController* (^block)()= ^(){
NSLog(@"這是第%d個",i);
UIViewController*viewc = [[UIViewController alloc] init];
viewc.view.backgroundColor= [UIColor colorWithRed:arc4random()%5/5.0 green:arc4random()%5/5.0 blue:arc4random()%5/5.0 alpha:1];
return viewc;
};
[_dic setObject:block forKey:key];
}
使用的時候這樣,取出block 運行block的到相應的vc?
-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath{
UIViewController* (^getblock)() = [_dic objectForKey:[NSString stringWithFormat:@"%d",indexPath.row]];
UIViewController*vc =getblock();
[self.navigationControllerpushViewController:vcanimated:YES];
二,直接通過字符串直接調用相應的方法,不過首先是要和后臺商量好格式。
//indexStr :是后臺數據,用來判斷執行的字符串。
NSString*selectStr = [indexStr stringByReplacingOccurrencesOfString:@"/"withString:@"_"];//替換使方法名合法
SEL select = NSSelectorFromString(selectStr) ;
if([self respondsToSelector:select]) {
UIViewController*vc = [self performSelector:select];
return vc;
} ?
例如后臺字符串傳來的是“shop/brand”,那么只需要添加方法
-(UIViewController*)shop_brand{
UIViewController*vc = [[UIViewController alloc]init];
NSLog(@"shop_brand");
return vc;
}
我們項目中使用的是第二種方法,個人覺得這樣對性能和代碼整潔有很大的幫助,有錯誤或者不妥的地方也歡迎指正。