iOS接收推送消息跳转相应的页面问题

转自:http://blog.csdn.net/a19860903/article/details/52535078


收到推送消息跳转相应的界面:

1、要跳转到相应的ViewController需要给每个界面赋予唯一的属性值,以便之后查找到相应的ViewController;

例如:

@interface HSFeedsViewController : UIViewController

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

/** 频道ID */

@property (nonatomic, copy) NSString *ID;

/** 频道type */

@property (nonatomic, copy) NSString *type;

@end


2、需要事先跟服务器商量好传入的推送消息模式为

NSDictionary *userInfo = @{

                           @"class": @"HSFeedsViewController",

                           @"property": @{

                                        @"ID": @"123",

                                        @"type": @"12"

                                   }

                           };


3、当接收到相应的推送消息时,

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

{

    [self push:userInfo];

}

4、跳转界面:

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

}


这样的跳转利用runtime就简单多了

具体使用和代码https://github.com/HHuiHao/Universal-Jump-ViewController







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值