KVO
KVO:key(键)Value(值)observe(观察者),有称键值观察者
通过对一个对象属性或者变量值的观察来做出对应的动作
只要key对应的值发生改变,就会告诉观察者,新旧值的改变
通过key来判断是哪一个KVO
1、有观察者、观察对象
添加观察者
给被观察的对象,添加一个观察者
[被观察的对象 addObserver:self forKeyPath:@“观察的属性” option:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
2、只要值发生改变就会去触发这个方法,告诉观察者值已经发生改变
只要观察者的值发生改变,就会去调用
KeyPath:观察的是哪一个属性
Object:用于传值
change:里面是一个字典包含发生改变的新值和旧值
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
3、****不在需要观察这个对象的时候,移除观察者,《只要不移除,就会崩溃》
[被观察的对象removeObserver:self forKeyPath:@"观察的属性"]
- (void)viewDidLoad {
[superviewDidLoad];
scrollView = [[UIScrollViewalloc]initWithFrame:[UIScreenmainScreen].bounds];
scrollView.backgroundColor= [UIColorredColor];
scrollView.contentSize= CGSizeMake(0,2000);
[self.viewaddSubview:scrollView];
//让self观察scrollView里面的contentOffset的值是否改变
[scrollViewaddObserver:selfforKeyPath:@"contentOffset"options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOldcontext:nil];
}
-(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary<NSString*,id> *)change context:(void*)context{
NSLog(@"%@",keyPath);
NSLog(@"%@",change);
//找到最新的值
CGPoint changePoint = [change[@"new"]CGPointValue];
CGFloat y = changePoint.y+64;
NSLog(@"%f",1-y/100);
self.navigationController.navigationBar.alpha= 1-y/100;
}
- (void)dealloc{
[scrollViewremoveObserver:selfforKeyPath:@"contentOffset"];
[superviewDidLoad];
scrollView = [[UIScrollViewalloc]initWithFrame:[UIScreenmainScreen].bounds];
scrollView.backgroundColor= [UIColorredColor];
scrollView.contentSize= CGSizeMake(0,2000);
[self.viewaddSubview:scrollView];
//让self观察scrollView里面的contentOffset的值是否改变
[scrollViewaddObserver:selfforKeyPath:@"contentOffset"options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOldcontext:nil];
}
-(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary<NSString*,id> *)change context:(void*)context{
NSLog(@"%@",keyPath);
NSLog(@"%@",change);
//找到最新的值
CGPoint changePoint = [change[@"new"]CGPointValue];
CGFloat y = changePoint.y+64;
NSLog(@"%f",1-y/100);
self.navigationController.navigationBar.alpha= 1-y/100;
}
- (void)dealloc{
[scrollViewremoveObserver:selfforKeyPath:@"contentOffset"];
}