gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:00:40 26 4
gpt4 key购买 nike

如果我正确阅读了文档,则对象可以注册为索引属性(也称为一对多关系)的观察者,就像注册为普通标量属性的观察者一样。

我已经实现了索引访问器,并且我知道它们可以工作,因为数组 Controller 使用它们来填充 TableView ,并且可变代理数组也可以看到并使用它们。他们的原型(prototype)如下:

// 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];

实际上,我从未在文档中看到过具体的示例,但在下面的页面(向底部)有一个如何手动执行此操作的示例:

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/Articles/KVOCompliance.html#//apple_ref/doc/uid/20002178-SW3

所以我的问题是:有没有办法自动获取通知,或者我是否必须手动执行此操作,就像文档中的示例一样?

编辑添加:

首先,一些上下文 - 这是一个非常简单的基于 NSDocument 的应用程序,其中 NSDocument 保存数据索引属性(其中每个对象都是一个字典),一个数组 Controller 绑定(bind)到 data 属性,以及一个 TableView 显示数据。我想要通知的原因是我想实现撤消,并且当通知起作用时,一切都会很好地工作。

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

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

[dataProxy addObject: <an object>]

这会调用访问器 insertData:atIndexes:正如预期的那样,但不会生成通知。

如果我直接调用它,就像这样:

[self insertData: <an object> atIndexes: [NSIndexSet indexSetWithIndex:[data count]]];

它按预期工作并生成自动通知。

请注意,上面的两种方法都调用相同的访问器,并且可能仍然有一些微妙的细节我没有注意到。

最后,为了完整起见,数组 Controller 调用访问器并生成通知。

最佳答案

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

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

关于Cocoa - KVO 和索引属性的自动通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7223177/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com