我的课程中有一个名为myName
的属性,如:
@property (nonatomic, strong) NSString *myName;
我需要在myName
属性的值发生更改时发送通知。
现在我正在做类似的事情:
- (void)setMyName:(NSString *)name
{
_myName = name;
[[NSNotificationCenter defaultCenter] postNotificationName:CHANGE_NOTIFICATION object:nil];
}
我知道iOS中有类似Key-Value Observing的内容。但我不知道如何实现它,我阅读了整个文档,但无法得到很好的理解。
请帮助我了解如何在不使用自定义设置器的情况下实现相同的功能。
答案 0 :(得分: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属性发生变化时,将随时调用此方法
答案 1 :(得分:15)
在- (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 :)
}
}
//每当属性的值发生变化时,都会调用此方法。
答案 2 :(得分:7)
要在没有客户设置器的情况下执行此操作,只需合成属性设置器即可。这将创建对willChangeValueForKey / didChangeValueForKey的所有支持调用。
@synthesize myName;
然后使用点语法设置属性值:
self.myName = @“Inigo Montoya”
然后观察者将自动收到KVO通知。
(在释放观察对象之前,您需要删除观察者。)