zoukankan      html  css  js  c++  java
  • 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
     
  • 相关阅读:
    【刷题】洛谷 P4319 变化的道路
    【刷题】BZOJ 4573 [Zjoi2016]大森林
    CSS3_天猫商品墙
    CSS3_3D 变换
    CSS3_扇形导航_transitionend 事件
    CSS3_过渡_2D 变换_瓶体旋转_动态时钟
    CSS3_多列布局
    CSS3_线性渐变_径向渐变----背景
    CSS3_盒子背景
    CSS3_盒阴影_倒影_盒子大小可调
  • 原文地址:https://www.cnblogs.com/hxwj/p/4793363.html
Copyright © 2011-2022 走看看