KVO 模式详解
KVO:观察者模式。当指定的被观察对象属性被修改时,允许对象接收到通知的机制。
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor=[UIColor whiteColor];
_dm=[[testmodel alloc]init];
[_dm setValue:@"张三" forKey:@"name"];
[_dm setValue:@"19" forKey:@"age"];
//注册成为观察者模式 选项参数指定了发送变更通知时提供给观察者的信息。使用NSKeyValueObservingOptionOld选项,可以将初始对象值,以变更字典中一个项的形式提供给观察者。NSKeyValueObservingOptionNew选项可以将新的值,以一个新项的形式添加到字典。
[_dm addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
testlab=[[UILabel alloc]initWithFrame:CGRectMake(100, 100, 150, 80)];
[testlab setText:[_dm valueForKey:@"name"]];
[self.view addSubview:testlab];
UIButton*testbtn=[UIButton buttonWithType:UIButtonTypeCustom];
testbtn.frame=CGRectMake(100, 300, 150, 80);
testbtn.backgroundColor=[UIColor redColor];
[testbtn setTitle:@"测试" forState:UIControlStateNormal];
[testbtn addTarget:self action:@selector(testBtn) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:testbtn];
}
-(void)testBtn{
[_dm setValue:@"wangzi" forKey:@"name"];
NSLog(@"test name is ");
}
//实现方法
第一个参数:键值路径
第二个参数:监听对象
第三个参数:变化的值
第四个参数:传递的内容
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
if([keyPath isEqualToString:@"name"])
{
//这里change中有old和new的值是因为我们在调用addObserver方法时,用到了
//NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;想要哪一个就用哪一个
//[change objectForKey:@"old"]是修改前的值
testlab.text = (NSString *)[_dm valueForKey:@"name"];
}

浙公网安备 33010602011771号