運行時實戰 1.實現隨意VC跳轉

背景:

一般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或者通知等等需要再添加的還是不能滿足,不過可以基于此思路擴展。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容