有一些控件的属性值苹果官方并没有开放可以让我们去修改(苹果有这个属性值,只是我们没有办法直接访问并修改),而我们有有需求去修改其属性值,这时就可以利用运行时机制去访问并修改
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.遍历成员变量
- (void)getIvars
{
unsigned int count = 0;
// 拷贝出所有的成员变量列表
Ivar *ivars = class_copyIvarList([UITextField class], &count);
for (int i = 0; i<count; i++) {
// 取出成员变量
// Ivar ivar = *(ivars + i);
Ivar ivar = ivars[i];
// 打印成员变量名字
XMGLog(@"%s %s", ivar_getName(ivar), ivar_getTypeEncoding(ivar));
}
// 释放
free(ivars);
}
</pre>
二.利用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,字典转模型了
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
//value:没有找到的key对应的值
//key:没有找到的key
//这里可以处理一下key,这样就可以重新和对应的属性值对应并赋值
if([key isEqualtoString:@"id"])
{
_ID=value;
}
}
</pre>
网友评论