我有一個NSUserDefaults項是一個字典數組。此數組中的每個字典都對應一個定義我關心的NSMenuItem屬性的對象。每個字典中的鍵/值屬性之一是一個布爾值,用於定義菜單項是應該顯示還是隱藏。這個值的關鍵是「show」。這裏有一個視覺例子:綁定到包含字典數組的NSUserDefaults
MenuItems (Array)
Item 0 (Dictionary)
label (String) "Menu Item 1"
show (Boolean) YES
Item 1 (Dictionary)
label (String) "Menu Item 2"
show (Boolean) NO
在這種情況下,第一個菜單項會顯示,但第二個菜單項不會。我希望這可以在用戶默認更改時(通過首選項窗格)動態更新。
理想情況下,我想將NSMenuItem上的「hidden」屬性直接綁定到相應的「show」值。不幸的是,根據NSMenuItem Bindings,隱藏不是可以綁定的東西。但我仍然試過,我不確定我在做什麼甚至會工作。困難在於這是一組字典,而且我不清楚綁定在這裏會起作用。我有一個綁定到sharedUserDefaults MenuItems的NSArrayController,我可以在調試時通過arrangeObjects看到各種數據。
我試過很多東西:
- 直接綁定到字典中值
- 創建每個字典包裹NSObjectController並綁定到的keyPath「content.show」
- 五合一詞典本身通過addObserver:forKeyPath:options:context
- 觀察如上所述的包裝的NSObjectController。
這些都不會導致任何事情發生。然而,直接觀察NSArrayController的arrangeObjects會觸發observeValueForKeyPath:...但這與真正使用整個豬並使用NSUserDefaultsDidChangeNotification沒有多大區別。
有沒有辦法通過綁定或KVO解決這個問題,這會讓我失望到我正在尋找的細節層面?
我猜測NSObjectController方法不起作用的原因是它製作數據的副本而不是綁定到原始用戶的默認數據。 – devguydavid 2012-03-27 05:56:51
我在其他地方跑過一篇文章,導致我綁定到「arrangeObjects.show」的keypath。除了新值之外,這種工作通過作爲到observeValueForKeyPath:方法*和*而被調用,用於數組中的每個*條目,而不僅僅是被更改的條目。我可以將原始索引作爲上下文工作,但由於它是爲數組中的每個項目調用的,因此效率很低。 –
devguydavid
2012-03-27 06:35:06