使用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通知。

(在释放观察对象之前,您需要删除观察者。)