简单的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"]]; } }