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

有一些控件的属性值苹果官方并没有开放可以让我们去修改(苹果有这个属性值,只是我们没有办法直接访问并修改),而我们有有需求去修改其属性值,这时就可以利用运行时机制去访问并修改
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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容