简单的KVO例子

我正在试图做简单的KVO例子,但我有问题。

这是我的* .m文件:

#import "KVO_ViewController.h" @interface KVO_ViewController () @property NSUInteger number; @end @implementation KVO_ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self addObserver:self forKeyPath:@"number" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction)incNumber:(id)sender { _number++; NSLog(@"%d", _number); } -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { NSLog(@"From KVO"); if([keyPath isEqualToString:@"number"]) { id oldC = [change objectForKey:NSKeyValueChangeOldKey]; id newC = [change objectForKey:NSKeyValueChangeNewKey]; NSLog(@"%@ %@", oldC, newC); } } @end 

注意:我有一个button,点击它将增加number属性。
我想在number属性发生变化时收到通知。

代码不工作,我不明白为什么。

KVO与setter和getter一起工作,在incNumber您直接访问iVar,而不是使用self.number

 - (IBAction)incNumber:(id)sender { self.number++; NSLog(@"%d", self.number); } 

而不是:

 _number++; 

尝试:

 [self willChangeValueForKey:@"number"]; _number++; [self didChangeValueForKey:@"number"]; 

或者更好的只是:

 self.number++ 

让系统照顾willChangeValueForKey:didChangeValueForKey:方法。

 @interface TraineeLocationCell : UIView @property (strong, nonatomic) NSString *traineeAddress; @end @implementation // in textview delgate method i am setting traineeAddress string value - (void)textViewDidEndEditing:(UITextView *)textView { if (textView.text.length >0) [self setValue:textView.text forKey:@"traineeAddress"]; } @end 

在其他课上,我正在使用这个类

  TraineeLocationCell *locationView;//create object here [locationView addObserver:self forKeyPath:@"traineeAddress" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];//observing the key in this class 

//这是关心值的委托方法是否改变

 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if([keyPath isEqualToString:@"traineeAddress"]){ if (!settingsValues.address) settingsValues.address = [[NSMutableArray alloc]initWithObjects:[change valueForKey:@"new"], nil]; else [settingsValues.address replaceObjectAtIndex:0 withObject:[change valueForKey:@"new"]]; } }