我有 2 个类,Foo 和 Bar,如下:
@interface Foo : NSObject
@property Bar *bar;
@end
@interface Bar: NSObject
@property int intVal;
@property long longVal;
@end
现在我想使用 KVO 来观察 Foo
类的对象的属性 bar
的变化。但我想知道如果我更改bar
的属性之一,intVal
或longVal
,是否有任何通知发送给观察者?
最佳答案
您可以使用 Foo 中的 KVO 观察 bar
的值变化,如下所示:
[bar addObserver:self
forKeyPath:@"intVal"
options:NSKeyValueObservingOptionNew
context:nil];
[bar addObserver:self
forKeyPath:@"longVal"
options:NSKeyValueObservingOptionNew
context:nil];
然后您需要实现 observeValueForKey
方法,如下所示:
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if ([keyPath isEqualToString:@"longVal"]) {
// property longVal changed
}
...
}
编辑:
已经指出的是答案的正确性,所以我会尽力使其更完整:
在 Foo 中声明一个全局变量,如下所示:
static void * const MyClassKVOContext = (void*)&MyClassKVOContext;
并在添加观察者时将其作为上下文传递:
[bar addObserver:self
forKeyPath:@"longVal"
options:NSKeyValueObservingOptionNew
context:MyClassKVOContext];
最后,当你观察到:
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if (context != MyClassKVOContext) {
[super observeValueForKeyPath:keyPath
ofObject:object
change:change
context:context]; return; }
if ([keyPath isEqualToString:@"longVal"]) {
// property longVal changed
}
...
}
这将保证观察上下文的最大可能的唯一性。有关更完整的解释,请参阅评论中的链接答案,因为我仍然认为超出了本主题的范围。
关于objective-c - 使用 KVO 观察自定义类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26547685/