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

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

1.遍历属性值


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

2.遍历成员变量

  • (void)getIvars
    {
    unsigned int count = 0;
    // 拷贝出所有的成员变量列表
    Ivar *ivars = class_copyIvarList([UITextField class], &count);
    for (int i = 0; i // 取出成员变量
    // Ivar ivar = *(ivars + i);
    Ivar ivar = ivars[i];
    // 打印成员变量名字
    XMGLog(@"%s %s", ivar_getName(ivar), ivar_getTypeEncoding(ivar));
    }
    // 释放
    free(ivars);
    }
二.利用KVC去改变自己想要的值

1.例如改变占位文字的值


// 修改占位文字颜色
[self setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];

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

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

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

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

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

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

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

例如-


[self setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];

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

解决KVC报错

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

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

  • (void)setValue:(id)value forUndefinedKey:(NSString *)key
    {
    //value:没有找到的key对应的值
    //key:没有找到的key
    //这里可以处理一下key,这样就可以重新和对应的属性值对应并赋值
    if([key isEqualtoString:@"id"])
    {
    _ID=value;
    }
    }

你可能感兴趣的:(利用运行时修改类属性(runtime))