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"];
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;
2、webview混排监听contentsize;
3、监听模型属性实时更新UI;
4、监听控制器frame改变,实现抽屉效果。