Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa-KVO和索引属性的自动通知_Cocoa_Macos_Key Value Observing - Fatal编程技术网

Cocoa-KVO和索引属性的自动通知

Cocoa-KVO和索引属性的自动通知,cocoa,macos,key-value-observing,Cocoa,Macos,Key Value Observing,如果我正确阅读了文档,对象可以注册为索引属性(也称为对多关系)的观察者,注册方式与注册为普通标量属性的观察者相同 我已经实现了索引访问器,我知道它们可以工作,因为数组控制器使用它们来填充表视图,而可变代理数组也可以看到它们并使用它们。他们的原型如下: // Make indexable accessors for data: - (NSUInteger)countOfData; - (id)objectInDataAtIndex:(NSUInteger)index; - (NSArray *)d

如果我正确阅读了文档,对象可以注册为索引属性(也称为对多关系)的观察者,注册方式与注册为普通标量属性的观察者相同

我已经实现了索引访问器,我知道它们可以工作,因为数组控制器使用它们来填充表视图,而可变代理数组也可以看到它们并使用它们。他们的原型如下:

// Make indexable accessors for data:
- (NSUInteger)countOfData;
- (id)objectInDataAtIndex:(NSUInteger)index;
- (NSArray *)dataAtIndexes:(NSIndexSet *)indexes;
- (void)insertObject:(NSDictionary *)dict inDataAtIndex:(NSUInteger)index;
- (void)insertData:(NSArray *)dataArray atIndexes:(NSIndexSet *)indexes;
- (void)removeObjectFromDataAtIndex:(NSUInteger)index;
- (void)removeDataAtIndexes:(NSIndexSet *)indexes;
我已通过以下方式注册了NSC文档以进行侦听:

[self addObserver:self 
       forKeyPath:@"data" 
          options:(NSKeyValueObservingOptionNew |
                   NSKeyValueObservingOptionOld |
                   NSKeyValueObservingOptionInitial |
                   NSKeyValueObservingOptionPrior)
          context:dataArrayChange];
实际上,我从未在文档中看到过这方面的具体示例,但在下面的页面(底部)中有一个如何手动执行的示例:

所以我的问题是:有没有办法自动获取通知,或者像文档中的例子那样,我必须手动获取通知

编辑以添加:

首先,一点上下文——这是一个非常简单的基于NSDocument的应用程序,其中NSDocument保存数据索引属性(其中每个对象都是一个字典),数组控制器绑定到数据属性,表视图显示数据。我想要通知的原因是我想实现撤销,当通知起作用时,一切都很好

其次,当我通过调用创建的代理访问数据时会出现问题:
dataProxy=[[self-mutableArrayValueForKey:@“data”]retain]-init
方法中的code>

我在代理上使用的调用是:

[dataProxy addObject: <an object>]
它按预期工作并生成自动通知

请注意,上面两个方法都调用相同的访问器,可能还有一些微妙的细节让我难以理解


最后,为了完整性,阵列控制器调用访问器并生成通知。

您不必担心手动管理观察,如果您有索引的访问器,那么KVO通知将自动发布


您是否实现了对象:更改:上下文:
的observeValueForKeyPath:ofObject:change:context:,以便在您观察到的属性发生更改时收到通知?这就是属性更改时将调用的方法。

是的,我已经实现了
observeValueForKeyPath:ofObject:change:context:
,并且它会被其他“常规”属性调用。当我使用手动通知时,它也会被调用,看起来是正确的信息,所以我认为它是有效的。你能在设置属性值的地方发布代码吗?因为我停止使用
mutableArrayValueForKey:
这个问题不知怎么消失了,所以我接受这个答案,显然是正确的。总有一天,我会进一步调查。可能相关:在第一个观察者注册后,您必须使用
mutableArrayValueForKey:
创建代理。@Jean Philippellet看起来这个问题和答案更为灵通,所以我将投票作为副本关闭这个问题和答案。请随意做同样的事情!
[self insertData: <an object> atIndexes: [NSIndexSet indexSetWithIndex:[data count]]];