Простой пример КВО
Я пытаюсь сделать простой пример КВО, но у меня проблемы.
Это мой *.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
Примечание: у меня есть кнопка, которая при нажатии будет увеличивать number
имущество.
Я хочу получать уведомления, когда number
свойство изменено.
Код не работает, и я не могу понять, почему.
3 ответа
Решение
КВО работает с сеттером и геттером и в 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"]];
}
}