refs:
http://blog.csdn.net/yan_daoqiu/article/details/39369429
refs中的例子很有说服力,和c#的bingding有异曲同工的感觉。
但是也有同样的困惑有些UI控件的属性不可观察。
一个SegmentControl,一个是TextField,还有一个是Person自定义类,
[self.mSegControl addTarget:self action:@selector(SegChangeValue:) forControlEvents:UIControlEventValueChanged];
[self.mSegControl addObserver:self forKeyPath:@"selectedSegmentIndex" options:NSKeyValueObservingOptionNew context:nil];
[self.mTextField addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew context:nil];
p =[[Person alloc] init];//监视对象
[p addObserver:self forKeyPath:@"name" options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) context:nil];
SegmentControl值变化后会更新Person的名字
-(IBAction)SegChangeValue:(id)sender
{
UISegmentedControl *seg=(UISegmentedControl *)sender;
p.name=[@"name_" stringByAppendingFormat:@"%d",seg.selectedSegmentIndex];
}
根据kvo观察到到变化
-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if ([keyPath isEqualToString:@"selectedSegmentIndex"]) {
id newVal=[change objectForKey:@"new"];
NSLog(@"changed to %@",newVal);
}
if ([keyPath isEqualToString:@"text"]) {
id newVal=[change objectForKey:@"new"];
NSLog(@"changed to %@",newVal);
}
if ([keyPath isEqualToString:@"name"]) {
id newVal=[change objectForKey:@"new"];
NSLog(@"name changed to %@",newVal);
}
}
其中TextField的text属性是观察不到的。