KVC

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

 



 



posted @ 2019-02-25 16:52  港吧休  阅读(498)  评论(0编辑  收藏  举报