KVC,KVO

来源:互联网 发布:2017网络春晚直播 编辑:程序博客网 时间:2024/06/06 20:52

NSKeyValueCoding 为 NSObject的category 所以所有NSObject的子类都具备下列方法;


设置一个对象属性的值

- (void)setValue:(id)value forKey:(NSString *)key;

获取一个对象属性的值

- (id)valueForKey:(NSString *)key;


可使用带有path的方法以点运算符组成的路径的形势完成KVO的获取与设置如:

    [self setValue:@"jack" forKeyPath:@"person.name"];    [self valueForKeyPath:@"person.name"]


当设置或获取的key不存在时会调用相应的undefined方法,可重写此方法使其完成正确的操作

当value为Nil时,如果被设置的属性不是对象时

- (void)setValue:(id)value forUndefinedKey:(NSString *)key{    if ([key isEqualToString:@"ErrorName"]) {        self.name = value;        return;    }    [super setValue:value forUndefinedKey:key];}- (id)valueForUndefinedKey:(NSString *)key{    if ([key isEqualToString:@"ErrorName"]) {        return self.name;    }    return [super valueForUndefinedKey:key];}- (void)setNilValueForKey:(NSString *)key{    if ([key isEqualToString:@"number"]) {        self.number = 0;        return;    }    [super setNilValueForKey:key];}

如果被作用于的对象是NSArray那么将产生一对多的结果

以下相当于调用NSArray中每一个元素的length方法,并将每一个元素的length返回的结果组合成新的NSArray返回

self.arr = @[@"a", @"aa", @"aaa", @"aaaa"];NSArray *lengthArray = [self.arr valueForKeyPath:@"length"];

以下相当于调用NSArray中的每一个元素的setNumber方法,并将value做为参数传入

[self setValue:@1 forKeyPath:@"arr.number"];


由此可见path的语法即是调用相应的getter和setter方法,如果方法没有找到且accessInstanceVariablesDirectly方法返回YES那么按顺便查找_+ , _is+, is+。开头的成员。如果仍然没有找到将会调用 valueForUndefinedKey方法


如果作用的对象是NSArray还可以使用复合条件


调用NSArray中每一个元素的floatValue方法,并将返回的所有值求平均数

[self.arr valueForKeyPath:@"@sum.floatValue"]
另外还有 @max @min @avg 可以使用,要求点后面指定的方法返回的必需是可计算值

@distinctUnionOfObjects 可以对返回的多个元素做去重操作

需要注意的是使用@特性其后必需有一个点即操作的方法名,如果相对元素本身操作可以使用self

self.arr = @[@"a", @"b", @"a", @"c"];[self.arr valueForKeyPath:@"@distinctUnionOfObjects.self"];



了解了KVC的机制后就可以利用这点做一些另类的事,比如,直接设置某个类的私有成员变量的值,即使这个变量没有提供使用对外可见的方法,只要已知变量名就可以通过KVC修改,比如修改UITextFiled的占位符字体颜色。

[filed setValue:[UIColor blackColor] forKeyPath:@"_placeholderLabel.textColor"];





0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 理财平台跑路了怎么办 联通4g信号不好怎么办 老年人耳朵嗡嗡响什么原因怎么办 单侧耳朵嗡嗡响怎么办 蚊子钻到耳朵里怎么办 小飞虫进耳朵里怎么办 耳朵里飞进去虫怎么办 耳朵里进虫子了怎么办 耳朵进虫子了怎么办啊 耳朵里进了蚊子怎么办 有虫子爬进耳朵怎么办 虫子死在耳朵里怎么办 早上起床口苦口臭怎么办 耳朵被耳屎堵了怎么办 油耳朵被堵住了怎么办 棉签掏耳朵堵了怎么办 耳朵被气堵住了怎么办 掏耳朵发炎了疼怎么办 掏耳朵掏深了疼怎么办 耳朵里进了虫子怎么办? 耳朵里飞进小虫怎么办 一只耳朵听力差怎么办 62岁耳朵有点聋怎么办 一支耳朵有点聋怎么办 80岁老人耳朵聋怎么办 被nlp课程洗脑了怎么办 手上张了个鸡眼怎么办 手上长了个鸡眼怎么办 6岁儿童手指脱皮怎么办 手指骨折后关节僵硬怎么办 手指外伤后关节肿大僵硬怎么办 胳膊骨折了手肿怎么办 耳朵被肘了耳鸣怎么办 耳朵鼓膜外显的怎么办 耳膜破了怎么办为好 耳朵的鼓膜破了怎么办 被打耳鼓膜穿孔怎么办 两只耳朵嗡嗡响怎么办 耳朵长了个脓包怎么办 胸一个大一个小怎么办 把耳朵掏出血了怎么办