ios kvc和kvo

173 阅读1分钟

kvc 键值编码(key-value-coding)

作用:

1、可以访问对象的私有属性值

UISearchBar *search = [[UISearchBar alloc] initWithFrame:CGRectMake(50, 300, 300, 40)];
search.backgroundColor = [UIColor redColor];
search.placeholder = @"12233";
[self.view addSubview:search];

NSLog(@"%@",[search valueForKey:@"placeholder"]);

打印结果12233

2、改变对象的私有属性值

[search setValue:@"通过kvc获取私有变量并赋值" forKey:@"placeholder"];

image.png

3、将字典转换成model

@interface PeopleModel : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@end

NSArray *dict = @[@{@"name":@"张三",@"age":@12},@{@"name":@"李四",@"age":@13}];

PeopleModel *p = [[PeopleModel alloc] init];

[p setValuesForKeysWithDictionary:dict[0]];
NSLog(@"%@---%d",p.name,p.age);

打印结果:张三---12

kvo 键值观察

一种观察者机制,通过监听对象的某个属性,如果属性改变,就调用方法“observeValueForKeyPath”

 - (void)kvoTest{
NSArray *dict = @[@{@"name":@"张三",@"age":@12},@{@"name":@"李四",@"age":@13}];

PeopleModel *p = [[PeopleModel alloc] init];

[p setValuesForKeysWithDictionary:dict[0]];

NSLog(@"%@---%d",p.name,p.age);

[p addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL];

[p setValue:@"王五" forKey:@"name"];
NSLog(@"%@",p.name);
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
    NSLog(@"%@",change);
    NSLog(@"newValue-----%@",change[@"new"]);
    NSLog(@"oldValue-----%@",change[@"old"]);
}

kvo的基本应用场景

 1下拉刷新下拉加载监听UIScrollView的contentoffsize;
 2webview混排监听contentsize;
 3监听模型属性实时更新UI;
 4监听控制器frame改变,实现抽屉效果