NSCountedSet上的KVO?

时间:2009-10-22 22:44:13

标签: cocoa cocoa-touch key-value-observing

我想监视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。

3 个答案:

答案 0 :(得分:7)

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

  1. 向业主发送mutableSetValueForKey:条消息。这将为您提供一个假设置对象,该对象包装该属性并围绕您对其进行的每次更改发布KVO通知。
  2. 为属性实现set访问器方法,并在任何地方使用它们。每个方法的实现直接与底层集合对象进行对话;所有不在这些方法之一的代码都应该通过它们。因此,例如,要添加对象,您不应使用[myCountedSet addObject:foo]addCountedSetObject:除外);你应该使用[self addCountedSetObject:foo]代替。
  3. 我推荐#2。这可能听起来像是更多的工作,但它并不多,而且它可以提供非常好的代码。

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

答案 1 :(得分:3)

对于无序的多对多关系,肯定存在KVO手动更改方法。

您不想将options设置为非零吗?例如,NSKeyValueObservingOptionNew

Mike Ash的KVO Helper非常出色。

来自addObserver的NSSet文档:

  

NSSet对象是不可观察的,所以   这个方法引发异常时   在NSSet对象上调用。代替   观察一组,观察无序   设置的多对多关系   是相关对象的集合。

答案 2 :(得分:0)

要检查的一些事项:

  1. myController非 - nil?如果是niladdObserver::::消息就会默默地落在地板上。
  2. 您的方法是否被调用?也许它被称为,但不是你所期望的关键路径。 (我也不希望这样,但值得检查。)