2011-08-28 80 views
0
自動通知

如果我已經閱讀的文檔正確地,一個對象可以作爲索引屬性(也稱爲對多的關係)的觀察者註冊它可以作爲一個觀察者寄存器相同的方式一個正常的標量屬性。可可 - 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]; 

其實我也從來沒有見過的文檔此一個具體的例子,但在頁面上下面(朝向下方)有一個如何做手工的例子:

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

所以我的問題是:有沒有辦法讓自動通知,還是必須手動執行,例如文檔中的示例?

編輯補充:

首先,位上下文的 - 這是一個非常簡單的基於NSDocument應用內,其中NSDocument保存數據索引屬性(其中每個對象是一個字典),陣列控制器綁定到數據屬性,並且表視圖顯示數據。我想要通知的原因是我想要實現撤消,並且當通知正常工作時,它都可以很好地工作。

其次,當我通過使用-init方法調用dataProxy = [[self mutableArrayValueForKey:@"data"] retain];創建的代理訪問數據時出現問題。

我對代理使用的電話是:

[dataProxy addObject: <an object>] 

這調用存取insertData:atIndexes:如預期,但不會生成一個通知。

如果我直接調用它,就像這樣:

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

它按預期工作,並生成一個自動通知。

注意,上面的調用兩種方法相同的訪問,並有可能仍然是逃避我一些微妙的細節。

最後,爲了完整起見,數組控制器調用訪問器並生成通知。

+0

可能相關:http://stackoverflow.com/q/19932947/390581你必須用'mutableArrayValueForKey創建代理:'** **後第一觀察者已被註冊。 –

+0

@ Jean-PhilippePellet看起來這個問題和答案是更多的信息,所以我會投票將其作爲一個副本來關閉這個問題。隨意做同樣的事! – Monolo

回答

1

你不需要擔心手工管理的意見,如果你有索引的存取則KVO通知將自動發佈。你

已經實施,以observeValueForKeyPath:ofObject:change:context:通知您觀察到的財產變化呢?這是在屬性更改時將調用的方法。

+0

是的,我已經實現了'observeValueForKeyPath:ofObject:change:context:',並獲取其他「常規」屬性的調用。當我使用手動通知時,它也被稱爲正確的信息,所以我認爲它可以工作。 – Monolo

+0

您可以在您設置財產價值的地方發佈代碼嗎? –

+0

因爲我停止使用'mutableArrayValueForKey:'問題已經以某種方式消失了,所以我會接受這個問題顯然是正確的答案。有一天,我會進一步調查。 – Monolo