运行时实战 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或者通知等等需要再添加的还是不能满足,不过可以基于此思路扩展。