美文网首页
利用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