应用场景:
接受推送消息,跳转页面
1、客户端需要和后台协商,定义好数据结构和规则,比如说商定之后,后台会给客户端传一个字典
/*
*class的value就是后台告诉你需要跳转的controller
*property的value就是需要传到这个Controller的参数
*/
NSDictionary *dict = @{@"class":@"DetaislController”,
@"property":@{@"ID":@"1",
@"type":@"200"}};
2、好,商定完了,后台怎么实现就让他们处理去,我们要做自己的事儿了。首先,假如我们在首页(大部分app都有首页的吧?),这个时候手机突然叮咚!!!来推送消息了,用户定睛一看,哇塞!是领优惠券的活动,激动的不行,刷!大拇指以迅雷不及掩耳盗铃之势对着消息按了上去,然后就屏幕一黑,闪退了,这个时候用户就疯了。哈哈哈哈……讲个笑话娱乐一下!言归正传!首先,我们要引入runtime的类库
#import <objc/runtime.h>
3、我们接受到了后台给我们的数据,首先要这样做
//把数据传到下面这个发方里来,处理一下
[self push:dict];
-(void)push:(NSDictionary *)params{
//通过这个字典获取类名,前提是我们这个Controller了是提前在程序里已经创建好了的啊,别整一个没创建的Controller跑这里嘚瑟
NSString *class = [NSString stringWithFormat:@"%@",params[@"class"]];
const char *className = [class cStringUsingEncoding:NSASCIIStringEncoding];
//通过字符串获得类
Class newClass = objc_getClass(className);
//实例化对象
id instance = [newClass new];
//通过字典获取到所有的参数,也可以叫属性,也可以叫实例
NSDictionary *propertys = params[@"property"];
//遍历一下,看看我们要进去的Controller里面是不是有这些参数已经声明过了
[propertys enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
// 检测这个对象是否存在该属性
BOOL isYES = [self checkPropertyWithInstance:instance verifyPropertyName:key];
if (isYES) {
// 利用kvc赋值
[instance setValue:obj forKey:key];
}
}];
// 跳转到对应的控制器
[self.navigationController pushViewController:instance animated:YES];
// [self presentViewController:instance animated:YES completion:nil];
}
4、在遍历的时候,不是有一个判断是否存在该属性的方法吗?下面这个就是
-(BOOL)checkPropertyWithInstance:(id)instance verifyPropertyName:(NSString *)verifyPropertyName{
//声明一个int类型的输出个数
unsigned int outCount = 0;
/*
*声明一个指针,获取对象里的成员变量,结束的时候要释放指针free()
*直接获取属性列表的方法
Ivar *ivarArray = class_copyIvarList([instance class], &outCount);替换下面的objc_property_t *properties = class_copyPropertyList([instance class], &outCount);
Ivar ivar = ivarArray[i];替换下面的objc_property_t property = properties[i];
ivar_getName(ivar)替换下面的property_getName(property)
使用Ivar的时候,涉及到解档的问题
*/
objc_property_t *properties = class_copyPropertyList([instance class], &outCount);
for (int 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;
}
5、好了,没了!写的不好,请多关照
网友评论