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

你可能感兴趣的:(运行时实战 1.实现随意VC跳转)