2012-03-27 35 views
1

我有一個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解決這個問題,這會讓我失望到我正在尋找的細節層面?

+0

我猜測NSObjectController方法不起作用的原因是它製作數據的副本而不是綁定到原始用戶的默認數據。 – devguydavid 2012-03-27 05:56:51

+0

我在其他地方跑過一篇文章,導致我綁定到「arrangeObjects.show」的keypath。除了新值之外,這種工作通過作爲到observeValueForKeyPath:方法*和*而被調用,用於數組中的每個*條目,而不僅僅是被更改的條目。我可以將原始索引作爲上下文工作,但由於它是爲數組中的每個項目調用的,因此效率很低。 – devguydavid 2012-03-27 06:35:06

回答

0

MenuItem隱藏屬性可以綁定,它在IB的選項列表中。然而,你不能綁定到一個數組中的對象,現在有辦法說,實際上,array.object1。我認爲如果你讓你的用戶默認一個詞典字典,你可以做你想做的事 - 頂層的鍵可以是「menuItem1」,「menuItem2」等,其值是一個包含你需要的所有其他鍵的字典。如果不知道用戶默認設置中還有什麼,這很難確定。如果它可以工作,你可以用valueForKeyPath得到你想要的信息:like dict.menuItem1.show

+0

我必須嘗試一下。感謝這個想法。可悲的是,我有另一個方向工作(表格視圖複選框綁定到一個數組控制器,綁定到用戶默認值)。這就是爲什麼我很困惑,爲什麼它不在這個方向工作。但我想我可以改變它來做字典的事情。 – devguydavid 2012-03-27 06:30:36