//
// ViewController.m
// Runtime处理界面跳转
//
// Created by 陆巧怡 on 15/9/15.
// Copyright (c) 2015年 Simon. All rights reserved.
//
#import "ViewController.h"
#import <objc/runtime.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
for (int i = 0; i<5; i++) {
UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
btn.frame = CGRectMake(0, 20+50*(i+1), 100, 40);
[btn setTitle:[NSString stringWithFormat:@"第%d个界面",i+1] forState:UIControlStateNormal];
btn.tag = i+1;
[btn addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
}
}
-(void)btnAction:(UIButton *)btn{
NSString *viewcontrollerName = nil;
switch (btn.tag) {
case 1:
{
viewcontrollerName = @"FirstViewController";
}
break;
case 2:
{
viewcontrollerName = @"SecondViewController";
}
break;
case 3:
{
viewcontrollerName = @"ThreeViewController";
}
break;
case 4:
{
viewcontrollerName = @"FourViewController";
}
break;
case 5:
{
viewcontrollerName = @"FiveViewController";
}
break;
default:
break;
}
[self pushViewcontroller:viewcontrollerName];
}
-(void)pushViewcontroller:(NSString *)viewcontrollerName{
//类名转换成char字符,用于下面创建类
const char *className = [viewcontrollerName cStringUsingEncoding:NSASCIIStringEncoding];
//获取目标类
Class targetObject = objc_getClass(className);
//如果这个类不存在===>动态创建类
if (!targetObject) {
/*
运行时创建类只需要三步:
1、为"class pair"分配空间(使用objc_allocateClassPair).
2、为创建的类添加方法和成员(上例使用class_addMethod添加了一个方法)。
3、注册你创建的这个类,使其可用(使用objc_registerClassPair)。
*/
//创建一个类
Class newClass = [NSObject class];
targetObject = objc_allocateClassPair(newClass, className, 0);
//注册这个类
objc_registerClassPair(targetObject);
}
//创建对象
id instanceObject = [[targetObject alloc]init];
/*
在这里,除了FirstViewController才有一个titleName的属性,其他ViewController都没有
模拟动态增加属性以及对已有属性进行赋值
*/
[self checkIsPropertyWithInstanceObject:instanceObject withPropertyName:@"titleName" withInstanceName:viewcontrollerName];
[self.navigationController pushViewController:(UIViewController *)instanceObject animated:YES];
}
#pragma mark 检测该对象是否包含该属性。包含就赋值。不包含就增加该属性,然后赋值
-(void)checkIsPropertyWithInstanceObject:(id)instanceObject withPropertyName:(NSString *)propertyName withInstanceName:(NSString *)instanceName{
u_int count;
//获取该对象里面的所有属性
objc_property_t *propertys = class_copyPropertyList(object_getClass(instanceObject), &count);
//记录是否有目标属性
BOOL targetPropertyBool = NO;
//遍历属性
for (int i =0; i<count; i++) {
//获取属性名字
const char *charName = property_getName(propertys[i]);
//匹配目标属性(propertyName)名字
if ([[NSString stringWithCString:charName encoding:NSUTF8StringEncoding] isEqualToString:propertyName]) {
//kvc赋值
[instanceObject setValue:instanceName forKey:propertyName];
targetPropertyBool = YES;
}
}
/*
OBJC_ASSOCIATION_ASSIGN; //assign策略
OBJC_ASSOCIATION_COPY_NONATOMIC; //copy策略
OBJC_ASSOCIATION_RETAIN_NONATOMIC; // retain策略
OBJC_ASSOCIATION_RETAIN;
OBJC_ASSOCIATION_COPY;
*/
/*
*
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
id object 给哪个对象的属性赋值
const void *key 属性对应的key
id value 设置属性值为value
objc_AssociationPolicy policy 使用的策略,是一个枚举值,和copy,retain,assign是一样的,手机开发一般都选择NONATOMIC
*/
//该对象里面没有这个属性(propertyName)则动态添加该属性(propertyName)
if (!targetPropertyBool) {
const char *charPropertyName = [propertyName cStringUsingEncoding:NSASCIIStringEncoding];
objc_setAssociatedObject(instanceObject, charPropertyName, instanceName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
free(propertys);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
相关推荐
-runtime-:使用Runtime跳转到指定页面:应用场景推送
根据规则跳转到指定的界面(runtime实用篇一) ####在开发项目中,会有这样变态的需求: 推送:根据服务端推送过来的数据规则,跳转到对应的控制器 feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定会跳转哪个界面哦,可能是这个又可能是那个,能给我做灵活吗?根据后台返回规则任意跳转?) 思考:wocao!这变态的需求,要拒绝他吗? switch判断呗,考虑所有跳转的因素?这不得写死我... switch () { case : break; default: break; } ####我是这么个实现的(runtime是个好东西) 利用runtime动态生成对象、属性、方法这特性,我们可以先跟服务端商量好,定义跳转规则,比如要跳转到A控制器,需要传属性id、type,那么服务端返回字典给我,里面有控制
iOS 万能跳转界面方法 (runtime实用篇一)
作者:汉斯哈哈哈 授权本站转载。 在开发项目中,会有这样变态的需求: 推送:根据服务端推送过来的数据规则,跳转到对应的控制器 feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定会跳转哪个界面哦,可能是这个又可能是那个,能给我做灵活吗?根据后台返回规则任意跳转?) 思考:wocao!这变态的需求,要拒绝他吗?
微型纵向加密在新能源场站中的实战部署与运维避坑指南
本文详细解析了微型纵向加密在新能源场站中的实战部署与运维技巧。通过国密算法SM4实现数据加密,确保新能源场站通信安全,同时提供非侵入式部署方案和运维避坑指南,帮助提升网络稳定性和运维效率。
iOS开发runtime实现任意界面跳转
iOS开发runtime实现任意界面跳转 1.在开发中我们常常有这种需求:比如说现在有一组列表,服务器返回的数据在这组列表中,点击列表的某一行是根据服务器返回的Action字段决定跳转,这个时候的界面跳转其实是不确定的,我们需要根据服务器返回的数据动态判断,这时,就可以通过运行时,只需要传入控制器的名称以及控制器的属性,我们就可以直接执行push操作,下面说说详细实现过程。 2.首先我们创建一
安装部署 Guacamole 远程桌面网关
Guacamole 是Apache基金会提供的一组基于web的远程桌面访问工具,支持 VNC、RDP、SSH、 Telnet 等协议,支持远程透传音视频。
Lumerical FDTD新手必看:从零开始搭建光子晶体仿真环境(附完整脚本)
本文为Lumerical FDTD新手提供光子晶体仿真环境的完整搭建指南,涵盖从基础参数设置到脚本编写的全流程。通过典型光子晶体带隙分析案例,详细讲解结构建模、仿真参数配置及后处理技巧,并附赠完整MATLAB脚本,帮助用户快速掌握FDTD仿真核心技术。
weex数据绑定
1、Weex使用语法({{...}})来对中的模板和里的数据进行绑定. 一旦数据和模板绑定了, 数据上的修改会实时的在模板内容中生效. 示例1:(直接把title和size的数值绑定到模板内容) {{title}} module.exports={ data:{ size:55, title:"字体大小" } } 示例2:(
AWS 小白书 [1] 全球架构
小白应该知道的 AWS 知识
Runtime的应用场景
1、动态给分类添加属性 这个应该使用的比较频繁,通过runtime动态添加属性,可以给系统类添加自定义属性,灵活使用,可以带来神奇的效果。 //(block直接调用手势的action) + (instancetype)mm_gestureRecognizerWithActionBlock:(MMGestureBlock)block { __typeof(self) weakSelf ...
OPC UA 服务端的模拟工具及客户端工具
详细介绍如何使用 Prosys OPC UA Simulation Server 作为 OPC UA 服务端的模拟工具来生成数据模型,并使用 Softing OPC UA Client 作为客户端工具,直观地查看和验证模拟生成的数据。
【推荐100个unity插件】实现逼真的雪与雨系统——Weatherade: Snow and Rain System
Weatherade是一款Unity雪天/雨天场景创建系统,支持内置RP和URP渲染管线,提供雪/雨覆盖着色器、地形支持、雪痕效果等特性。安装后需配置URP渲染器,通过添加覆盖实例和转换材质实现效果,支持手动调整或批量转换工具快速应用。系统包含完整演示场景,可通过官方文档了解更多配置细节。下载地址:Unity Asset Store或百度网盘学习版。
runtime从入门到精通(六)—— runtime在实际开发中的应用
上一篇文章,我们学习了runtime的消息发送和消息转发机制(查看链接: runtime从入门到精通(五)—— 消息发送和消息转发 ),倒到此为止,有关runtime的理论知识介绍就先告于段落,小伙伴们,真正的干货来了,runtime在实际的开发中到底有何牛X的作用?我们该怎么使用这么牛X的工具呢?
基于imx6ull平台opencv的图像采集、ffmpeg推流和Windows端拉流(多线程)
本文档是针对imx6ull平台`opencv`的图像采集、ffmpeg推流和Windows端拉流。首先创建一个线程`opencv`通过摄像头采集视频图像,接着再创建两个线程,其中一个线程获取采集的视频图像送给ffmpeg服务,另一个线程用于获取采集的视频图像并处理,处理完并在显示屏上显示,详细的流程请参看如下。
runtime从入门到精通(九)—— 万能界面跳转
由于文章篇幅长度原因,笔者单独用一篇文章来介绍使用runtime来实现万能控制器跳转。查看完整的runtime在实际开发中的使用点击链接 ——> runtime从入门到精通(六)—— runtime在实际开发中的应用 在你的开发过程中,是否遇到过如下的需求: 在tableView类型的展示列表中,点击每个cell中人物头像都可以跳转到人物详情,可参见微博中的头像,同理包括转发、评论按...
Python+OpenCV实现车牌检测与识别
使用Python+OpenCv实现车牌检测与识别,算法思想来自于网上资源,先使用图像边缘和车牌颜色定位车牌,再识别字符。车牌定位在预测方法中,为说明清楚,完成代码和测试后,加了很多注释,请参看源码。车牌字符识别也在预测方法中,请参看源码中的注释,需要说明的是,车牌字符识别使用的算法是OpenCv的SVM,OpenCv的SVM使用代码来自于OpenCv附带的样本。由于训练样本有限,你测试时会发现,车...
廖雪峰Python教程[完整版]
廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白
iOS 万能跳转界面方法(实用推送跳转、不固定界面跳转)
runtime是个好东西 利用runtime动态生成对象、属性、方法这特性,我们可以先跟服务端商量好,定义跳转规则,比如要跳转到A控制器,需要传属性id、type,那么服务端返回字典给我,里面有控制器名,两个属性名跟属性值,客户端就可以根据控制器名生成对象,再用kvc给对象赋值,这样就搞定了。 比如:根据推送规则跳转对应界面HSFeedsViewController HSFeedsV
RU DOS版、EFI版32bit/64bit BIOS常用工具
DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。
iOS Runtime实现给一个扩展类添加属性
Category
LinePhone3.2.7(android端最新版本) sip客户端
SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/
pscad IEEE标准系统搭建说明
pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。
iOS 万能跳转界面方法(runtime实用篇一)
在开发项目中,会有这样的需求: 推送:根据服务端推送过来的数据规则,跳转到对应的控制器 feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定会跳转哪个界面哦,可能是这个又可能是那个,能给我做活吗?根据后台返回规则来跳吗?) 这时,你wocao!难道这样干的吗? switch判断呗,考虑所有跳转的因素进去?这不得写死你…switch () { case
OC 中runtime的理解 以及 使用
什么是Runtime 我们写的代码在程序运行过程中都会被转化成runtime的C代码执行,例如[target doSomething];会被转化成objc_msgSend(target, @selector(doSomething));。 OC中一切都被设计成了对象,我们都知道一个类被初始化成一个实例,这个实例是一个对象。实际上一个类本质上也是一个对象,在runtime中用结构体表示。
ios 通过kvc修改属性会触发kvo_iOS 万能跳转界面方法
作者:饶旭东在使用 JPush 、JMessage、JMLink 等 SDK 时,iOS 客户端可能会收到下发的通知,或者收到回调里的返回参数,在拿到参数后可能会有些场景需要跳转到目标页。通过 runtime 机制我们可以灵活的在服务端控制某条消息跳转到对应目标页。runtime 是个好东西利用 runtime 动态生成对象、属性和方法的特性,我们可以先跟服务端商量好,定义跳转规则。比如要跳转到 ...
795



被折叠的 条评论
为什么被折叠?



