我想监视NSCountedSet以查看其内容是否发生了变化。设置KVO似乎是编译但它没有被触发。第一个问题:你能观察到一套吗?如果是这样,那么这条消息有问题吗?
[subViewA addObserver:subViewB forKeyPath:@"countedSet" options:0 context:NULL];
如果有帮助的话,我真的只是想监视集合中的(强对象数量)数量。
编辑 - 这是观察者(subViewB):
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if ([keyPath isEqual:@"countedSet"]) {
NSLog(@"Set has changed");
}
}
Edit2 - 将addObserver消息从subView移动到viewController。所以我试图让一个subView观察另一个viewController的子视图中的NSCountedSet。关键路径是“相对于接收器” - 我假设它是subViewA。
答案 0 :(得分:7)
直接与设置对象交谈不会发出KVO更改通知。您需要以符合KVC的方式更改属性的设置值。有两种方法:
mutableSetValueForKey:
条消息。这将为您提供一个假设置对象,该对象包装该属性并围绕您对其进行的每次更改发布KVO通知。[myCountedSet addObject:foo]
(addCountedSetObject:
除外);你应该使用[self addCountedSetObject:foo]
代替。我推荐#2。这可能听起来像是更多的工作,但它并不多,而且它可以提供非常好的代码。
更多详情in the Model Object Implementation Guide和in the Core Data Programming Guide(即使这不是特定于核心数据)。
答案 1 :(得分:3)
对于无序的多对多关系,肯定存在KVO手动更改方法。
您不想将options设置为非零吗?例如,NSKeyValueObservingOptionNew
Mike Ash的KVO Helper非常出色。
来自addObserver的NSSet文档:
NSSet对象是不可观察的,所以 这个方法引发异常时 在NSSet对象上调用。代替 观察一组,观察无序 设置的多对多关系 是相关对象的集合。
答案 2 :(得分:0)
要检查的一些事项:
myController
非 - nil
?如果是nil
,addObserver::::
消息就会默默地落在地板上。