如何通过NSArrayController获得有关模型更改的通知?

toh*_*lio 8 cocoa objective-c key-value-observing nsarraycontroller cocoa-bindings

我有一个NSView子类,它绑定到arrangedObjects一个NSArrayController.当数组插入或删除项目时,将通知视图.如果存储在数组中的模型的属性发生了变化,如何通知它?

我是否需要将我的视图作为观察者添加到添加到数组中的每个项目的每个(相关)属性?

当一个项目添加到数组或从数组中删除时observeValueForKeyPath:ofObject:change:context:,我会通过我的NSView子类通知我.我没有收到存储在数组中的模型更改的通知,但我可以在每次收到插入通知时,将视图作为观察者添加到新项目的属性中.这是最好的方法吗?

addObserver为模型类进行了覆盖,以便我可以看到发生了什么,并注意到NSTableView绑定到的列arrangedObjects将自己添加为适当属性的观察者.这可以自动发生还是我手动设置观察?

toh*_*lio 9

非常感谢dreamlax,但我认为我没有做好解释我的问题的工作.我的模型类是可观察的并产生了正确的通知,但我无法在不直接观察数组中的每个项目的情况下如何观察它们.

我认为关键路径的文档可以改进,因为我找不到任何解释我需要进行的非常简单的更改的内容.数组魔术键路径有一些很好的信息,但没有简单的"这些是常见的东西"文档.

无论如何.以前在我的NSView子类中我有以下内容:

- (void) bind:(NSString *)binding toObject:(id)observable withKeyPath:(NSString *)keyPath options:(NSDictionary *)options
{
  if ([binding isEqualToString:@"observedObjects"]) {
    [observable addObserver:self forKeyPath:@"arrangedObjects" options:0 context:nil];
  } else {
    [super bind:binding toObject:observable withKeyPath:keyPath options:options];
  }
}
Run Code Online (Sandbox Code Playgroud)

为了让内部的变化对模型的通知NSArrayControllerarrangedObjects所有我需要补充的是观察arrangedObjects.name(对于name我的模型的属性).所以上面的代码成了:

- (void) bind:(NSString *)binding toObject:(id)observable withKeyPath:(NSString *)keyPath options:(NSDictionary *)options
{
  if ([binding isEqualToString:@"observedObjects"]) {
    [observable addObserver:self forKeyPath:@"arrangedObjects" options:0 context:nil];
    [observable addObserver:self forKeyPath:@"arrangedObjects.name" options:0 context:nil];
  } else {
    [super bind:binding toObject:observable withKeyPath:keyPath options:options];
  }
}
Run Code Online (Sandbox Code Playgroud)

而已!现在,如果有任何对象arrangedObjects得到name改变,我会收到通知.

  • 很好的答案。但是如果*任何*属性发生更改,我们如何得到通知?即如果我想观察我的 8 个不同属性(名称、值等)中的任何一个的变化,是否有必要为每个属性添加一个观察者?我想@dreamlax 的解决方案适用于此,但有没有人找到一种方法来做到这一点,同时仍在使用 KVO? (2认同)