美文网首页
iOS 跳转界面方法(runtime)

iOS 跳转界面方法(runtime)

作者: Jacob_Pan | 来源:发表于2015-09-11 17:23 被阅读296次

    学习连接:http://www.cocoachina.com/ios/20150824/13104.html


    问题:

    推送:根据服务端推送过来的数据规则,跳转到对应的控制器

    feeds列表:不同的cell,可能跳转不同的控制器


    利用runtime动态生成对象、属性、方法这特性,与服务端制定好规则,再用kvc给对象复制


    HSFeedsViewController.h:

    进入该界面需要传的属性:

    @interface HSFeedsViewController : UIViewController

    // 注:根据下面的两个属性,可以从服务器获取对应的频道列表数据

    /** 频道ID */

    @property (nonatomic, copy) NSString *ID;

    /** 频道type */

    @property (nonatomic, copy) NSString *type;

    @end


    AppDelegate.m:

    推送过来的消息规则:


    NSDictionary *userInfo = @{

    @"class": @"HSFeedsViewController",

    @"property": @{

    @"ID": @"123",

    @"type": @"12"

    }

    };


    接受推送消息:

    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

    {

    [self push:userInfo];

    }


    跳转界面


    - (void)push:(NSDictionary *)params

    {

    // 类名

    NSString *class =[NSString stringWithFormat:@"%@", params[@"class"]];

    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];

    // 对该对象赋值属性

    NSDictionary * propertys = params[@"property"];

    [propertys enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {

    // 检测这个对象是否存在该属性

    if ([self checkIsExistPropertyWithInstance:instance verifyPropertyName:key]) {

    // 利用kvc赋值

    [instance setValue:obj forKey:key];

    }

    }];

    // 获取导航控制器

    UITabBarController *tabVC = (UITabBarController *)self.window.rootViewController;

    UINavigationController *pushClassStance = (UINavigationController *)tabVC.viewControllers[tabVC.selectedIndex];

    // 跳转到对应的控制器

    [pushClassStance 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;

    }

    相关文章

      网友评论

          本文标题:iOS 跳转界面方法(runtime)

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