如果我已正确阅读文档,则对象可以注册为索引属性的观察者(也称为多对多关系),就像它可以注册为普通标量属性的观察者一样。
我已经实现了索引访问器,我知道它们有效,因为数组控制器使用它们来填充表视图,并且可变代理数组也可以看到它们并使用它们。他们的原型如下:
// 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;
我已注册NSDocument以下列方式收听:
[self addObserver:self
forKeyPath:@"data"
options:(NSKeyValueObservingOptionNew |
NSKeyValueObservingOptionOld |
NSKeyValueObservingOptionInitial |
NSKeyValueObservingOptionPrior)
context:dataArrayChange];
我实际上从未在文档中看到过这方面的具体示例,但是在下面的页面上(向下)有一个如何手动执行此操作的示例:
所以我的问题是:有没有办法自动获取通知,或者我是否必须手动执行此操作,例如文档中的示例?
编辑添加:
首先,一些上下文 - 这是一个非常简单的基于NSDocument的应用程序,其中NSDocument保存数据索引属性(其中每个对象都是字典),数组控制器绑定到数据属性,以及表视图显示数据。我想要通知的原因是我想实现撤销,当通知工作时,一切都很好。
其次,当我通过使用dataProxy = [[self mutableArrayValueForKey:@"data"] retain];
方法中的-init
调用创建的代理访问数据时,会出现问题。
我在代理上使用的电话是:
[dataProxy addObject: <an object>]
这会按预期调用访问者insertData:atIndexes:
,但不会生成通知。
如果我直接打电话,就像这样:
[self insertData: <an object> atIndexes: [NSIndexSet indexSetWithIndex:[data count]]];
按预期工作并生成自动通知。
请注意,上述两种方法都调用相同的访问器,并且可能仍有一些微妙的细节可以逃避我。
最后,为了完整性,阵列控制器调用访问器并生成通知。
答案 0 :(得分:1)
您无需担心手动管理观察,如果您有索引访问者,则会自动发布KVO通知。
您是否实施了observeValueForKeyPath:ofObject:change:context:
以获知被观察资产的变化?这是属性更改时将调用的方法。