使用KVO更改属性时发送通知

Mid*_* MP 15 properties objective-c key-value-observing ios

我有一个myName在我班上命名的房产,如:

@property (nonatomic, strong) NSString *myName;
Run Code Online (Sandbox Code Playgroud)

myName属性的值发生变化时,我需要发送通知.

现在我做的事情如下:

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

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

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

ale*_*lex 31

试试这个:

MyClass *var = [MyClass new];
[var addObserver:self forKeyPath:@"myName" options:NSKeyValueChangeOldKey context:nil];
Run Code Online (Sandbox Code Playgroud)

并实施

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{

}
Run Code Online (Sandbox Code Playgroud)

myName属性更改时,将随时调用此方法


dev*_*luv 15

- (void)setMyName:(NSString *)name做到这一点,而不是

[self willChangeValueForKey:@"myName"];
_myName = name;
[self didChangeValueForKey:@"myName"];

//this generates the KVO's
Run Code Online (Sandbox Code Playgroud)

你想要监听的地方(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 :)
    }
}
Run Code Online (Sandbox Code Playgroud)

//每当属性的值发生变化时,都会调用此方法.

  • 这个答案比接受的答案要好得多,答案没有说明如何实施KVO,只是如何监听已经实施的KVO通知 (3认同)

Wal*_*ers 7

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

@synthesize myName;

然后使用dot-syntax设置属性值:

self.myName = @"Inigo Montoya"

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

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