发送通知当一个属性更改使用KVO(Send Notification When a Property

2019-08-16 23:01发布

我有一个命名的属性myName在我的课,如:

@property (nonatomic, strong) NSString *myName;

我需要的时候发送通知myName属性的值被改变。

现在我做这样的事情:

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

我知道有类似键-值观察 iOS中。 但我不知道如何实现它,我阅读整个文档,但无法得到很好的理解。

请帮助我了解如何实现同样没有使用定制的setter。

Answer 1:

试试这个:

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属性更改时



Answer 2:

- (void)setMyName:(NSString *)name改为这样做

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

//this generates the KVO's

而且,你要听(在的viewController),在viewDidLoad中有加入这一行:

[瓦特的addObserver:自forKeyPath:@ “MYNAME” 选项:NSKeyValueObservingOptionNew上下文:无];

//通过这样做,你注册的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 :)
    }
}

//调用此方法,每当属性的值被改变。



Answer 3:

要做到这一点,而不客户制定者,只是合成的属性设置。 这将创建所有支持调用willChangeValueForKey / didChangeValueForKey。

@synthesize myName;

然后设置与点语法属性值:

self.myName = @ “伊尼戈蒙托亚”

那么观察员将自动接收志愿通知。

(你需要释放你的观察对象之前删除的观察者。)



文章来源: Send Notification When a Property is Changed Using KVO