美文网首页
运行时实战 1.实现随意VC跳转

运行时实战 1.实现随意VC跳转

作者: Dan_ | 来源:发表于2018-05-23 16:39 被阅读10次

    背景:

    一般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跳转

          本文链接:https://www.haomeiwen.com/subject/koorjftx.html