我想监视 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 移动到 View Controller 。所以我试图让一个 subview 观察另一个 View Controller subview 中的 NSCountedSet。关键路径是“相对于接收者”——我假设它是 subViewA。

最佳答案

直接与 set 对象对话不会发出 KVO 更改通知。您需要以符合 KVC 的方式更改属性的设置值。有两种方式:

  • 向业主发送 mutableSetValueForKey: 消息。这将为您提供一个伪造的 set 对象,该对象包装该属性并围绕您对其所做的每个更改发布 KVO 通知。
  • 为属性实现 set 访问器方法,并在任何地方使用它们。每个方法的实现直接与底层的集合对象对话;不在这些方法之一中的所有代码都应该通过它们。因此,例如,要添加对象,您不应使用 [myCountedSet addObject:foo] (在 addCountedSetObject: 中除外);你应该使用 [self addCountedSetObject:foo] 代替。

  • 我推荐#2。听起来可能需要做更多的工作,但实际上并不多,而且可以编写出非常好的代码。

    更多细节 in the Model Object Implementation Guidein the Core Data Programming Guide (即使这不是特定于核心数据)。

    关于cocoa - NSCountedSet 上的 KVO?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1610422/

    10-12 12:39