KVC “键--值 编码”是一种直接访问对象属性(用字符串象征)的 机制!机制! 不是通过调用设置器访问器方法 或者点语法去访问对象的属性
KVO "键--值 监听"定义了这种机制 NSObject为所有对象提供了一个自动观测能力的NSKeyValueObserving 机制,可以根据需要来打开这个监听机制。 !!!KVO是基于KVC来实现的 一共两步。注册,监听 其实注册可以理解为添加
//forKeyPath:@"backgroundColor" keyPath就是要观察的属性值
// backgroundColor 为UIColor的一种属性
//options 监听的选项
//NSKeyValueObservingOptionNew 指返回的字典包含的新值
//NSKeyValueObservingOptionOld 指返回的字典包含的旧值
下图Xcode显示的效果是backgroundView(背景)监听 设置的images 的随机色变化 自身颜色跟着变化的效果
- (void)viewDidLoad {
[super viewDidLoad];
self.myView=[[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)]; 此处的myView为设置的view属性
self.myView.backgroundColor=[UIColor redColor];
[self.view addSubview:self.myView];
通过button的点击方法实现一个简单的添加(注册) 观察(监听)效果
UIButton *btn=[UIButton buttonWithType:(UIButtonTypeCustom)];
[btn setTitle:@"变色" forState:(UIControlStateNormal)];
btn.backgroundColor=[UIColor redColor];
[btn setTitleColor:[UIColor blackColor] forState:(UIControlStateNormal)];
btn.frame=CGRectMake(100, 50, 40, 40);
[btn addTarget:self action:@selector(Action) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:btn];
}
-----------------------------添加(注册)
- (void)Action
{
[self.myView addObserver:self forKeyPath:@"backgroundColor" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
//NSKeyValueObservingOptionNew 指返回的字典包含的新值
//NSKeyValueObservingOptionOld 指返回的字典包含的旧值
self.myView.backgroundColor=[UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1.0];
}
-----------------------------------观察(监听)
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
self.view.backgroundColor=[UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1.0];
[self.myView removeObserver:self forKeyPath:@"backgroundColor"];
}
//NSKeyValueObservingOptionNew 指返回的字典包含的新值
//NSKeyValueObservingOptionOld 指返回的字典包含的旧值