15

myName我有一个在我的班级中命名的属性,例如:

@property (nonatomic, strong) NSString *myName;

myName我需要在属性值更改时发送通知。

现在我正在做类似的事情:

- (void)setMyName:(NSString *)name
{
  _myName = name;
  [[NSNotificationCenter defaultCenter] postNotificationName:CHANGE_NOTIFICATION object:nil];
}

我知道在 iOS 中有类似Key-Value Observing的东西。但是我不知道如何实现它,我阅读了整个文档,但无法很好地理解。

请帮助我了解如何在不使用自定义设置器的情况下实现相同的功能。

4

3 回答 3

31

试试这个:

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 属性更改时,将随时调用此方法

于 2013-02-14T09:57:07.930 回答
16

改为- (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 :)
    }
}

//只要属性的值发生变化,就会调用这个方法。

于 2013-02-14T09:58:10.887 回答
7

要在没有客户设置器的情况下执行此操作,只需合成属性设置器。这将创建对 willChangeValueForKey / didChangeValueForKey 的所有支持调用。

@synthesize myName;

然后使用点语法设置属性值:

self.myName = @"伊尼戈蒙托亚"

然后观察者将自动收到 KVO 通知。

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

于 2013-02-14T10:19:43.313 回答