以下为精简版KVO的使用
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
UILabel *label = [[UILabel alloc] init];
label.text = @"123";
[label addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew context:nil];
label.text = @"341";
//options: 有4个值,分别是:
//NSKeyValueObservingOptionOld 把更改之前的值提供给处理方法
//NSKeyValueObservingOptionNew 把更改之后的值提供给处理方法
//可以俩个都用,用|隔开
//NSKeyValueObservingOptionInitial 把初始化的值提供给处理方法,一旦注册,立马就会调用一次。通常它会带有新值,而不会带有旧值。
//NSKeyValueObservingOptionPrior 分2次调用。在值改变之前和值改变之后。
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
NSLog(@"%@的值已经改变", keyPath);
NSLog(@"被修改的属性值为:%@", [change objectForKey:@"text"]);
NSLog(@"被修改的上下文%@", context);
NSLog(@"被修改的对象%@", object);
}
-(void)dealloc{
[self removeObserver:self forKeyPath:@"text"]; // 移除监听器
}
我们创建了一个label,然后为他的text属性加了一个监听器
[label addObserver:self forKeyPath:@“text” options:NSKeyValueObservingOptionNew context:nil];
然后重写
(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context这个方法
在text的值发生变化时会激发这个方法,从而可以拿到一些值
使用场景
1.被监听者是viewControll类的实例对象
2.重写方法 谁作为观察者谁重新方法
以上为自动KVO。
手动的咱也不会