一、KVC字典转模型的实现原理
假设dict字典中有name,icon的Key,CYXModel模型类中必须要有同名的name,icon属性与之相对应。
我们使用[XXModel setValuesForKeysWithDictionary:dict];进行字典转模型。
setValuesForKeysWithDictionary:方法内部实现原理如下:
(1) 遍历字典里面所有的key和值,name,icon。
// enumerateKeysAndObjectsUsingBlock:遍历字典中的所有keys和valus
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
// 利用KVC给模型中属性赋值,,
// key:用来给哪个属性
// Value:给模型的值
[CYXModel setValue:obj forKey:key];
}];
(2) 分别给属性赋值
- [XXModel setValue:dict[@"name"] forKey:@"name"];
- [XXModel setValue:dict[@"icon"] forKey:@"icon"];
setValue:forKey:方法:给模型的属性赋值
赋值原理:
(1)去模型中查找有没有setIcon方法,就直接调用这个set方法,给模型这个属性赋值[self setIcon:dict[@"icon"]];
(2)如果找不到set方法,接着就会去寻找有没有icon属性,如果有,就直接访问模型中icon = dict[@"icon"];
(3)如果找不到icon属性,接着又会去寻找_icon属性,如果有,直接_icon = dict[@"icon"];
(4)如果都找不到就会报错
[<Flag 0x7fb74bc7a2c0> setValue:forUndefinedKey:]
扩展:读者可以去查查KVV(键值验证),进一步理解报错原因与容错方法。
二、修改系统控件内部属性(runtime + KVC)
需求: 正常的UIPageControl 都是小圆点,但是现在设计的是横线的形式
(1)通过runtime遍历出UIPageControl所有属性(包括私有成员属性,runtime确实很强大)。找到属性_pageImage和_currentPageImage属性
(2)利用KVC设置属性
UIPageControl *pageControl = [[UIPageControl alloc] init];
[pageControl setValue:[UIImage imageNamed:@"home_slipt_nor"] forKeyPath:@"_pageImage"];
[pageControl setValue:[UIImage imageNamed:@"home_slipt_pre"] forKeyPath:@"_currentPageImage"];
原文链接[ https://www.jianshu.com/p/fbd1e7c93fd0 ]
参考链接[ http://ios.jobbole.com/84954/ ]