使用KVO更改属性时发送通知
我在我的课堂上有一个名为myName
的属性,如:
@property (nonatomic, strong) NSString *myName;
当myName
属性的值改变时,我需要发送一个通知。
现在我正在做一些事情:
- (void)setMyName:(NSString *)name { _myName = name; [[NSNotificationCenter defaultCenter] postNotificationName:CHANGE_NOTIFICATION object:nil]; }
我知道有一些像iOS中的键值观测 。 但是我不知道如何实现,我读了整个文档,但是不能很好的理解。
请帮助我了解如何在不使用自定义setter的情况下实现相同的function。
尝试这个:
MyClass *var = [MyClass new]; [var addObserver:self forKeyPath:@"myName" options:NSKeyValueChangeOldKey context:nil];
并执行
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { }
这个方法将会在myName属性发生变化的时候被调用
在- (void)setMyName:(NSString *)name
做这个,而不是
[self willChangeValueForKey:@"myName"]; _myName = name; [self didChangeValueForKey:@"myName"]; //this generates the KVO's
在你想要听的地方(viewController),在viewDidLoad中添加这一行:
[w addObserver:self forKeyPath:@“myName”options:NSKeyValueObservingOptionNew context:nil];
//通过这样做,你注册viewController来收听KVO。
也执行这个方法:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([[change objectForKey:NSKeyValueChangeNewKey] isEqual:[NSNull null]]) { return; } else { //read the change dictionary, and have fun :) } }
//只要属性值改变,就调用这个方法。
要做到这一点,没有客户setter,只是综合属性设置。 这将创build所有对willChangeValueForKey / didChangeValueForKey的支持调用。
@synthesize myName;
然后用dot-syntax设置属性值:
self.myName = @“Inigo Montoya”
然后观察员将自动收到KVO通知。
(在释放观察对象之前,您需要删除观察者。)