2010-04-19 55 views
1

我對可可中的綁定世界相當陌生,我有一些麻煩(也許/可能是由於誤解)。更新表列綁定到NSArrayController

我有一個單例,它包含一個名爲plugins的NSMutableArray,它包含類Plugin的對象。它有一個名爲loadPlugins的方法,它將對象添加到插件數組中。這可能會在任何時候被調用。它已被添加爲Interface Builder中的一個實例。

另外在IB中是一個NSObjectController,其內容出口連接到單例。還有一個NSArrayController,其contentArray綁定到NSObjectController(控制鍵是'selection',模型鍵路徑是'plugins',對象類名是'Plugin')。

最後,我有一個2列的表視圖,它們的值綁定到NSArrayController的arrangeObjects,使用Plugin類中的屬性鍵。

到目前爲止這麼標準(據我至少可以從教程中知道)。我的麻煩是,當在單例中調用loadPlugins方法,並且將對象添加到插件數組中時,表不會更新以顯示對象(除非在加載nib之前調用loadPlugins)。在tableView上調用的-reloadData不會執行任何操作。

有沒有辦法告訴NSArrayController引用的數組已被更新?我知道NSArrayController有-add:方法,可以在loadPlugins中使用,但是這不是我想要的,因爲我想讓單例完全獨立於顯示方面。

這似乎與有關: Refresh Cocoa-Binding - NSArrayController - ComboBox

行:「編輯控制器的背後陣列」好像或許查明問題,但我希望這將是可能有單不知道控制器。

在此先感謝。

\編輯...

按TechZen的建議,這裏的綁定:

TableColumn --('arrangedObjects', 'pluginName', Value)--> NSArrayController 
NSArrayController --('selection', 'plugins', ContentArray)--> NSObjectController 
NSObjectController --(content)--> PluginsManager 

回答

5

作爲一個有點哈克的方式得到它的工作(通過觸發相應的志願通知) ,嘗試把:

[self willChangeValueForKey:@"plugins"]; 
[plugins addObject:somePlugin]; 
[self didChangeValueForKey:@"plugins"]; 

而不是

[plugins addObject:somePlugin]; 

理想情況下,你應該實行全員上KVC支持,那麼你可以使用KVC觸發ķ VO將觸發綁定更新。如果你這樣做,你可以再使用:

[self insertObject:somePlugin inPluginsAtIndex:0]; 

有關什麼是必需的KVC合規的信息,請閱讀本:http://developer.apple.com/mac/library/documentation/cocoa/conceptual/KeyValueCoding/Concepts/Compliant.html

0

有沒有辦法告訴 NSArrayController的被引用 陣列已經更新?

您不應該。這是關鍵價值觀察的目的。它是整個綁定功能的基礎。綁定對象(本例中爲接口元素)會自動觀察(接收通知)它觀察的對象已更改。您不應該永遠不得不手動告訴它發生了變化。如果表不更新,那麼綁定是錯誤的。

從文本描述很難說,但我認爲你的問題是你有NSObjectController設置爲「選擇」。這隻會在你將另一個UI元素綁定到NSObjectController並且該元素在控制器中選擇了一個數據項時才起作用。

你可以嘗試寫出來的綁定是這樣的:

Object1--(controller key, key path, class)--> Object2 
Object2--(controller key, key path, class)--> Object3 

你可能會看到這個問題,如果你將它張貼我們其餘的人都能理解它。

(需要有一個標準,代表綁定和核心數據的關係以文字,但我想我們會矇混過關。)

2

我已經想通了這一點 - 它的RTFM(和理解,TFM)的經典案例。全部歸結爲ensuring KVC compliance

在插件管理辛格爾頓,其中有我只是需要所謂的「插件」的陣列,以實現:

-insertObject:inPluginsAtIndex: 
-removeObjectFromPluginsAtIndex: 

,然後使用這些方法時,我想添加/刪除插件。

感謝您的幫助球員。

+0

這是非常有用的。感謝您回答您自己的問題 - 這對我來說是一大步。 – 2010-07-17 03:00:36

相關問題