美文网首页
利用runtime实现页面跳转

利用runtime实现页面跳转

作者: 邓布利多教授 | 来源:发表于2019-03-06 15:23 被阅读0次

    应用场景:

    接受推送消息,跳转页面

    1、客户端需要和后台协商,定义好数据结构和规则,比如说商定之后,后台会给客户端传一个字典

    /*
    *class的value就是后台告诉你需要跳转的controller
    *property的value就是需要传到这个Controller的参数
    */
    NSDictionary *dict = @{@"class":@"DetaislController”,
                        @"property":@{@"ID":@"1",
                                    @"type":@"200"}};
    

    2、好,商定完了,后台怎么实现就让他们处理去,我们要做自己的事儿了。首先,假如我们在首页(大部分app都有首页的吧?),这个时候手机突然叮咚!!!来推送消息了,用户定睛一看,哇塞!是领优惠券的活动,激动的不行,刷!大拇指以迅雷不及掩耳盗铃之势对着消息按了上去,然后就屏幕一黑,闪退了,这个时候用户就疯了。哈哈哈哈……讲个笑话娱乐一下!言归正传!首先,我们要引入runtime的类库

    #import <objc/runtime.h>
    

    3、我们接受到了后台给我们的数据,首先要这样做

    //把数据传到下面这个发方里来,处理一下
    [self push:dict];
    
    -(void)push:(NSDictionary *)params{
        
        //通过这个字典获取类名,前提是我们这个Controller了是提前在程序里已经创建好了的啊,别整一个没创建的Controller跑这里嘚瑟
        NSString *class = [NSString stringWithFormat:@"%@",params[@"class"]];
        const char *className = [class cStringUsingEncoding:NSASCIIStringEncoding];
        
        //通过字符串获得类
        Class newClass = objc_getClass(className);
        
        //实例化对象
        id instance = [newClass new];
        
        //通过字典获取到所有的参数,也可以叫属性,也可以叫实例
        NSDictionary *propertys = params[@"property"];
        //遍历一下,看看我们要进去的Controller里面是不是有这些参数已经声明过了
        [propertys enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
            // 检测这个对象是否存在该属性
            BOOL isYES = [self checkPropertyWithInstance:instance verifyPropertyName:key];
            if (isYES) {
                // 利用kvc赋值
                [instance setValue:obj forKey:key];
            }
        }];
        // 跳转到对应的控制器
        [self.navigationController pushViewController:instance animated:YES];
    //    [self presentViewController:instance animated:YES completion:nil];
        
    }
    

    4、在遍历的时候,不是有一个判断是否存在该属性的方法吗?下面这个就是

    -(BOOL)checkPropertyWithInstance:(id)instance verifyPropertyName:(NSString *)verifyPropertyName{
        
        //声明一个int类型的输出个数
        unsigned int outCount = 0;
        
        /*
         
         *声明一个指针,获取对象里的成员变量,结束的时候要释放指针free()
         
         *直接获取属性列表的方法
         Ivar *ivarArray = class_copyIvarList([instance class], &outCount);替换下面的objc_property_t *properties = class_copyPropertyList([instance class], &outCount);
         
         Ivar ivar = ivarArray[i];替换下面的objc_property_t property = properties[i];
         
         ivar_getName(ivar)替换下面的property_getName(property)
         
         使用Ivar的时候,涉及到解档的问题
         
         */
        objc_property_t *properties = class_copyPropertyList([instance class], &outCount);
        
        for (int i = 0; i < outCount; i++) {
            
            //取出所有成员变量对应的属性名
            objc_property_t property = properties[i];
            
            //属性名转成字符串
            NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property)
                                                              encoding:NSUTF8StringEncoding];
            //判断该属性是否存在
            if ([propertyName isEqualToString:verifyPropertyName]) {
                free(properties);
                return YES;
            }
            
        }
        free(properties);
        
        return NO;
        
    }
    

    5、好了,没了!写的不好,请多关照

    相关文章

      网友评论

          本文标题:利用runtime实现页面跳转

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