什么是KVC?
KVC说通俗点就是通过属性的名称(key)给这个属性赋值,或者通过属性的名称(key)获取该属性的名称. 换句话说就是通过属性的key给value赋值,或者通过属性的key获取value.
除了一般的赋值和取值的方法,我们还可以用Key-Value-Coding(KVC)键值编码来访问你要存取的类的属性。
KVC的使用!
比如有一个person类,该类@property一个name属性,我们在访问该类name属性时只需要
Person * p = [[Person alloc]init];
p.name = @"张三";
使用KVC
Person * p = [[Person alloc]init];
//赋值
[p setValue:@"张三" forKey:@"name"];
//取值
NSString * name = [p valueForKey:@"name"];
不仅如此,KVC还可以访问私有属性,当我们给person类声明一个私有属性,是不被外界访问的.
#import <Foundation/Foundation.h>
@interface Person : NSObject{
@private NSString * age;//私有属性
}
@property(nonatomic,copy)NSString * name;
@end
此时我们用p.age是访问不到该age属性的.我们用KVC就可以访问该属性以及修改该属性的值.方式同上name属性
KVC中除了setValue forKey之外还有个setValueForKeyPath的方法(键路径访问),例如在上述person类中还有个boy类,boy类中有name属性
Boy.h
#import <Foundation/Foundation.h>
@interface Boy : NSObject{
NSString * name;
}
@end
Person.h
#import "Boy.h"
@interface Person : NSObject{
@private NSString * age;//私有属性
Boy * boy;
}
@property(nonatomic,copy)NSString * name;
@end
main
Person * p = [[Person alloc]init];
//赋值
[p setValue:@"男孩" forKeyPath:@"boy.name"];
//取值
[p valueForKeyPath:@"boy.name"];
KVC访问可变容器类
比如使用kvc访问可变数组
[p mutableArrayValueForKey:@"arr"];
KVC与字典
Person * p = [Person new];
p.name = @"明名字";
p.sex = @"男";
NSArray * arr = @[@"name",@"sex"];
//把对应key所有的属性全部取出来
NSDictionary* dict = [p dictionaryWithValuesForKeys:arr];
NSDictionary* modifyDict = @{@"name":@"名字",@"sex":@"男"};
//用key Value来修改Model的属性
[p setValuesForKeysWithDictionary:modifyDict];
在开发中应用最多的就是利用KVC访问私有属性成员变量.比如修改
UITextField 占位符颜色类似等等场景
[textField setValue:[UIColor grayColor] forKeyPath@"placeholderLabel.textColor"];
配合KVO监听可变容器变化
NSMutableArray * tempArr = [_p mutableArrayValueForKey:@"arr"];
[tempArr addObject:@"1"];
KVC可以触发KVO