如果我已經閱讀的文檔正確地,一個對象可以作爲索引屬性(也稱爲對多的關係)的觀察者註冊它可以作爲一個觀察者寄存器相同的方式一個正常的標量屬性。可可 - KVO和索引屬性
我已經實現索引訪問器,我知道他們的工作,因爲陣列控制器使用它們來填充表視圖,和一個可變的代理服務器陣列看到他們,並使用他們。他們的原型如下:
// 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保存數據索引屬性(其中每個對象是一個字典),陣列控制器綁定到數據屬性,並且表視圖顯示數據。我想要通知的原因是我想要實現撤消,並且當通知正常工作時,它都可以很好地工作。
其次,當我通過使用-init
方法調用dataProxy = [[self mutableArrayValueForKey:@"data"] retain];
創建的代理訪問數據時出現問題。
我對代理使用的電話是:
[dataProxy addObject: <an object>]
這調用存取insertData:atIndexes:
如預期,但不會生成一個通知。
如果我直接調用它,就像這樣:
[self insertData: <an object> atIndexes: [NSIndexSet indexSetWithIndex:[data count]]];
它按預期工作,並生成一個自動通知。
注意,上面的調用兩種方法相同的訪問,並有可能仍然是逃避我一些微妙的細節。
最後,爲了完整起見,數組控制器調用訪問器並生成通知。
可能相關:http://stackoverflow.com/q/19932947/390581你必須用'mutableArrayValueForKey創建代理:'** **後第一觀察者已被註冊。 –
@ Jean-PhilippePellet看起來這個問題和答案是更多的信息,所以我會投票將其作爲一個副本來關閉這個問題。隨意做同樣的事! – Monolo