为什么80%的码农都做不了架构师?>>>   

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

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

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

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

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

switch () {case :break;default:break;
}

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

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

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

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([instanceclass], &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://my.oschina.net/qiukun/blog/628880

使用runtime跳转界面相关推荐

  1. iOS万能跳转界面的方法

    在开发项目中,会有这样变态的需求: 推送:根据服务端推送过来的数据规则,跳转到对应的控制器 feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定会跳转哪个界面哦 ...

  2. android 自启动列表,Android 机型设置自启动的跳转界面

    Android 机型设置自启动的跳转界面 由于之前版本号把23,6.0误写成26,8.0了,导致一些判断是错的,并且在catch中没有重新对intent更新,导致会有崩溃问题,现已修复. 简书怎么传附 ...

  3. Android九宫格界面实现点击每个格点击跳转界面

    刚开始有个任务就是做一个九宫格界面,后来有个任务就是实现点击每个格并跳转界面实现每个格的功能.下面我就介绍一下我是如何实现该功能的 首先写一下我的想法是: 登录成功后显示一个九宫格界面,每个九宫格的每 ...

  4. 基于Autoware分析runtime manager人机交互界面模块作用

    基于Autoware分析runtime manager人机交互界面模块作用 用过Autoware的小伙伴都知道,Autoware是一款完全开源的自动驾驶框架,同时它有一个人机交互界面runtime m ...

  5. JavaScript实现5秒后跳转界面

    打开代码,静待5秒后跳转新界面 代码如下: <!DOCTYPE html> <html lang="en"><head><meta cha ...

  6. Vuerouter跳转界面后空白,要刷新之后才会显示

    情景: vue 点击退出登录后,再次点击登录. 问题: Vue-router跳转界面后,url变化,但页面空白,要刷新之后才会显示新页面 代码: logout({ commit, state, dis ...

  7. iOS 使用百度的人脸识别登录验证,解决认证失败不跳转界面连续认证,认证相似度对比...

    在使用百度人脸识别出现的问题:小米6调用摄像机是黑白的一个情况,iOS上会出现识别准确性上的问题(多次代开认证,会通过) 人脸识别(活体验证): 1.芝麻认证 : 0.4元/次,需要企业企业认证.不能 ...

  8. iOS-UIViewController视图控制器跳转界面的几种常用方法

    一.最普通的视图控制器UIViewContoller 一个普通的视图控制器一般只有模态跳转的功能(ipad我不了解除外,这里只说iPhone),这个方法是所有视图控制器对象都可以用的,而实现这种功能, ...

  9. iOS之浅谈纯代码控制UIViewController视图控制器跳转界面的几种方法

    一.最普通的视图控制器UIViewContoller 一个普通的视图控制器一般只有模态跳转的功能(ipad我不了解除外,这里只说iPhone),这个方法是所有视图控制器对象都可以用的,而实现这种功能, ...

  10. jqury ajax跳转界面,jquery ajax 界面跳转失败解决方案

    jquery  ajax 界面跳转 window.location.href="http://localhost:9999/wsn/portal/test.html"; 1.aja ...

最新文章

  1. 全文解析:面向基于区块链的「机器人经济学」概念中,如何验证自主智能体的行为?...
  2. 机器学习(四)——损失函数
  3. html圆角边框只有左边,border-radius以外的CSS圆角边框制作方法
  4. VTK:地形抽取用法实战
  5. vue项目中使用swiper
  6. python保存模型与参数_基于pytorch的保存和加载模型参数的方法
  7. oracle 实现HA,使用KeepAlived实现HAProxy高可用
  8. 各种乐器与人声的频率特性说明
  9. [Java] 蓝桥杯ADV-178 算法提高 简单加法
  10. hashset如何检查重复_如何使用 C# 中的 HashSet
  11. vcpkg如何全面卸载和重新安装包
  12. yb3防爆电机型号含义_YBX3防爆电机
  13. Vscode配置C++(一步一步图文详解)
  14. FastStone注册码
  15. 抽奖机(用随机数)2.0-python
  16. mysql表分区备份_ZRM 2.1:备份MySQL分区表
  17. 【211南京理工大学】新增网络空间安全学院,学硕专硕都招!
  18. java调用插件_从任何java应用程序调用自己的eclipse插件方法
  19. 2021-07-21实用型OEM信息修改
  20. 晒晒我历年双十一的清单!

热门文章

  1. 计算两个日期的时间间隔,返回的是时间间隔的日期差的绝对值.
  2. 在Linux上运行ASP.NET vNext
  3. nodejs首个框架开发(先只发个连接,有空再写)
  4. Mysql 设置问题,当使用一些开源的软件动态安装MYSQL数据库后,发现里面的中文全是乱码。...
  5. java Object类的公共方法
  6. 利用WPF建立自己的3d gis软件(非axhost方式)(四)在地图上添加FrameworkElement
  7. @Autowired的使用--Spring规范解释,推荐对构造函数进行注释
  8. 利用PyCharm进行Python远程调试
  9. UIScrollView 和 UICollectionView 分页效果
  10. Apache-一个IP多个主机域名