博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS推送跳转AppDelegate跳转VC
阅读量:5881 次
发布时间:2019-06-19

本文共 2627 字,大约阅读时间需要 8 分钟。

在开发项目中,会有这样变态的需求:

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

feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定会跳转哪个界面哦,可能是这个又可能是那个,能给我做灵活吗?根据后台返回规则任意跳转?)

思考:wocao!这变态的需求,要拒绝他吗?

switch判断呗,考虑所有跳转的因素?这不得写死我...

switch () {

case :
break;
default:
break;
}

我是这么个实现的(runtime是个好东西)

利用runtime动态生成对象、属性、方法这特性,我们可以先跟服务端商量好,定义跳转规则,比如要跳转到A控制器,需要传属性id、type,那么服务端返回字典给我,里面有控制器名,两个属性名跟属性值,客户端就可以根据控制器名生成对象,再用kvc给对象赋值,这样就搞定了 ---O(∩_∩)O哈哈哈

比如:根据推送规则跳转对应界面FirstViewController

FirstViewController.h:

进入该界面需要传的属性

@interface FirstViewController : UIViewController

// 注:根据下面的两个属性,可以从服务器获取对应的频道列表数据
/** 频道ID /
@property (nonatomic, copy) NSString
ID;
/** 频道type /
@property (nonatomic, copy) NSString
type;
@end

AppDelegate.m:

推送过来的消息规则

// 这个规则肯定事先跟服务端沟通好,跳转对应的界面需要对应的参数

NSDictionary *userInfo = @{
@"class": @"FirstViewController",
@"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;
    }

转载于:https://www.cnblogs.com/liuqixu/p/4757526.html

你可能感兴趣的文章
远程主机探测技术FAQ集 - 扫描篇
查看>>
C++中调用python函数
查看>>
Nomad添加acl认证
查看>>
“TI门外汉”网路知识笔记一 OSI参考模型
查看>>
你不需要jQuery(五)
查看>>
DatanodeDescriptor说明
查看>>
ServlertContext
查看>>
eclipse编辑器生命周期事件监听
查看>>
Python WOL/WakeOnLan/网络唤醒数据包发送工具
查看>>
sizeof(long)
查看>>
pxe网络启动和GHOST网克
查看>>
2.5-saltstack配置apache
查看>>
django数据库中的时间格式与页面渲染出来的时间格式不一致的处理
查看>>
Python学习笔记
查看>>
java String
查看>>
renhook的使用
查看>>
Linux学习笔记(十二)--命令学习(用户创建、删除等)
查看>>
DOCKER windows 7 详细安装教程
查看>>
养眼美女绿色壁纸
查看>>
U盘启动盘制作工具箱 v1.0
查看>>