背景:
一般app運營位置都會有類似需求,需要一個banner或者按鈕實現隨意跳轉。我們一般的實現方式是與服務端定義特定的type來跳轉特定的頁面。
問題:
業務復雜、增長較快時,type類型過多,需要一個簡單的跳轉就需要維護新增type并且發版本來實現。
思考:
能不能客戶端一次簡單代碼,之后服務端想咋跳就咋跳(當然某個版本沒有這個類不能跳),或者說部分想咋跳就咋跳
方案:
通過runtime,動態生成類,并且可以傳遞相應參數。具體思路為動態生成類,并且通過key去修改類的參數。
代碼:
主要實現的是跳轉到單品頁并且傳入了相應的productId
-(void)runtimeclick {
? ? [self runtimeclickWithclassName:@"productViewController" keyNname:@"productId"];
}
- (void)runtimeclickWithclassName:(NSString * ) VCName keyNname:(NSString *)keyNname {
? ? UIViewController * targetVC = nil;
? ? const char * className = [VCName UTF8String];
? ? Class kclass = objc_getClass(className);
? ? if (kclass)
? ? {
? ? ? ? targetVC = [[kclass alloc]init];
? ? ? ? if (targetVC) {
? ? ? ? ? ? unsigned int count = 0;
? ? ? ? ? ? Ivar * ivar = class_copyIvarList(kclass, &count);
? ? ? ? ? ? ///遍歷屬性,去尋找到name的字段
? ? ? ? ? ? for(int i=0;i
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ///獲取實例變量
? ? ? ? ? ? ? ? Ivar var = ivar[i];
? ? ? ? ? ? ? ? const char * varName = ivar_getName(var);
? ? ? ? ? ? ? ? ///獲取名字
? ? ? ? ? ? ? ? NSString * name = [NSString stringWithUTF8String:varName];
? ? ? ? ? ? ? ? keyNname = [NSString stringWithFormat:@"_%@",keyNname];
? ? ? ? ? ? ? ? ///判斷名字是不是name屬性
? ? ? ? ? ? ? ? if([name isEqualToString:keyNname])
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? object_setIvar(targetVC, var, @"7894");
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? [self presentViewController:targetVC animated:YES completion:nil];
? ? ? ? ? ? free(ivar);
? ? ? ? }
? ? }
}
總結:
以上知識簡單實用運行時部分方法實現一個小的功能。這樣不單解決了業務需求同時代碼也有些代碼解耦的思想。但是這個方法偏展示型ViewController。有代理或者block或者通知等等需要再添加的還是不能滿足,不過可以基于此思路擴展。