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

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

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

#import "WJRuntime.h"

#import 
@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的使用二, 知道类名跳转界面, 并实现传值)