• iOS-runtime-根据类名推送到任意控制器,且实现属性传值


    //
    //  WJRuntime.m
    //  RuntimeSkip
    //
    //  Created by tqh on 15/9/8.
    //  Copyright (c) 2015年 tqh. All rights reserved.
    //
    
    #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 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
     
  • 相关阅读:
    markdown基本语法
    每天一个Linux命令:pwd(3)
    每天一个Linux命令:cd(2)
    每天一个Linux命令:ls(1)
    每天一个Linux命令:man(0)
    maven命令行创建项目问题
    Regular Expression
    JS事件流
    canvas与svg区别
    js调试
  • 原文地址:https://www.cnblogs.com/hxwj/p/4793363.html
Copyright © 2020-2023  润新知