美文网首页
Runtime的使用二, 知道类名跳转界面, 并实现传值

Runtime的使用二, 知道类名跳转界面, 并实现传值

作者: e40c669177be | 来源:发表于2018-12-06 11:49 被阅读13次

    也是项目中的问题...., 类不同, 但是每个类要传的数据都是相同的, 熟知本人的人都知道, 我是一个能躺着绝对不会坐着, 能靠着绝对不会站着. 所有我会写重复一样的代码么?? 当然不会的.

    这个没经过一个上午加一个中午, 经过了, 一个小时从网上找的代码😂🤣........

    #import "WJRuntime.h"
    
    #import <objc/runtime.h>
    @implementation WJRuntime
    
      //runtime跳转
    
      + (void)runtimePush:(NSString *)vcName dic:(NSDictionary *)dic nav:(UINavigationController *)nav {
    //类名(对象名)
    
    NSString *class = vcName;
    
    const char *className = [class cStringUsingEncoding:NSASCIIStringEncoding];
    Class newClass = objc_getClass(className);
    if (!newClass) {
        //创建一个类
        Class superClass = [NSObject class];
        newClass = objc_allocateClassPair(superClass, className, 0);
        //注册你创建的这个类
        objc_registerClassPair(newClass);
    }
    // 创建对象(写到这里已经可以进行随机页面跳转了)
    id instance = [[newClass alloc] init];
    
    //下面是传值--------------
    
    [dic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        if ([self checkIsExistPropertyWithInstance:instance verifyPropertyName:key]) {
            //kvc给属性赋值
            
            [instance setValue:obj forKey:key];
        }else {
            NSLog(@"不包含key=%@的属性",key);
        }
    }];
    nav.hidesBottomBarWhenPushed = YES;
    [nav pushViewController:instance animated:YES];
    
      }
      /**
       *  检测对象是否存在该属性
       */
      + (BOOL)checkIsExistPropertyWithInstance:(id)instance verifyPropertyName:(NSString *)verifyPropertyName
      {
    unsigned int outCount, i;
    
    // 获取对象里的属性列表
    objc_property_t * properties = class_copyPropertyList([instance
                                                           class], &outCount);
    
    for (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;
      }
    
      @end
    

    相关文章

      网友评论

          本文标题:Runtime的使用二, 知道类名跳转界面, 并实现传值

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