利用运行时修改类属性(runtime)

2016-11-16  本文已影响0人  怪兽密保

有一些控件的属性值苹果官方并没有开放可以让我们去修改(苹果有这个属性值,只是我们没有办法直接访问并修改),而我们有有需求去修改其属性值,这时就可以利用运行时机制去访问并修改
1.首先遍历想要修改的类的属性,使用运行时机制查看其内部的一些属性,看有没有我们需要的。

1.遍历属性值
<pre>
+ (void)getProperties
{
unsigned int count = 0;
objc_property_t *properties = class_copyPropertyList([UITextField class], &count);
for (int i = 0; i<count; i++) {
// 取出属性
objc_property_t property = properties[i];
// 打印属性名字
XMGLog(@"%s <----> %s", property_getName(property), property_getAttributes(property));
}
free(properties);
}
</pre>

<pre>

2.遍历成员变量

二.利用KVC去改变自己想要的值

1.例如改变占位文字的值
<pre>
// 修改占位文字颜色
[self setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];
</pre>

补充KVC(键值编码)的一些知识点

可以通过seetter、getter 方法来设置和修改对象的属性值,也可以通过简化的点预防来设置、修改对象的属性值。实际上,Objective-C还支持一种更灵活的操作方式,就是以字符串形式简介操作对象的属性,这种方式全称是Key value Coding(KVC)即键值编码

setValue: 属性值 forkey: 属性名 为指定属性设置值

valueForKey:属性名 获取知道属性的值

在KVC协议中操作Key路径的方法

setValue:forkeyPath: 根据Key路径设置属性值

valueForKeyPath: 根据Key路径获取属性值

例如-
<pre>
[self setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];
</pre>

setValuesForKeysWithDictionary: 根据字典来为对应的属性值赋值
注意:属性名必须和字典值一一对应否则会报错

解决KVC报错

KVC报错一般都是找不到对应的Key;这时就需要重写setValue:forUndefinedKey:方法
<pre>

// 系统调用这个方法,就会报错,可以把系统的方法覆盖,就能继续使用KVC,字典转模型了

上一篇 下一篇

猜你喜欢

热点阅读