什么是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