绑定到包含字典数组的NSUserDefaults

时间:2012-03-27 05:50:46

标签: objective-c cocoa nsuserdefaults cocoa-bindings

我有一个NSUserDefaults项目,它是一个字典数组。此数组中的每个字典对应于一个对象,该对象定义了我关心NSMenuItem的属性。每个字典中的一个键/值属性是一个布尔值,用于定义是显示还是隐藏菜单项。这个值的关键是“显示”。这是一个直观的例子:

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,隐藏不是可以绑定的东西。但无论如何我试过了,我不确定我在做什么甚至会工作。困难在于这是一系列字典,我不清楚绑定在这里是如何工作的。我有一个NSArrayController绑定到sharedUserDefaults MenuItems,我可以在调试时通过arrangeObjects看到各种数据。

我尝试了很多东西:

  • 直接绑定到字典值
  • 为每个字典创建一个包装NSObjectController并绑定到keypath“content.show”
  • 通过addObserver:forKeyPath:options:context
  • 观察字典本身
  • 如上所述观察包装的NSObjectController。

这些都不会导致任何事情发生。但是,直接观察NSArrayController的arrangeObjects会触发observeValueForKeyPath:...但这与仅仅为了整个生猪并使用NSUserDefaultsDidChangeNotification真的没什么不同。

有没有办法通过绑定或KVO来解决这个问题,这会让我达到我正在寻找的细节水平?

1 个答案:

答案 0 :(得分:0)

可以绑定MenuItem隐藏属性,它位于IB中的选项列表中。但是,您无法绑定到数组中的对象,现在可以说,实际上是array.object1。如果你让你的用户默认使用字典词典,我认为你可以做你想要的 - 顶层的键可以是“menuItem1”,“menuItem2”等,其值是一个包含你需要的所有其他键的字典。如果不知道您的用户默认值中还有其他内容,那么很难判断这是否可行。如果它可以工作,你可以使用valueForKeyPath获取你想要的信息:如dict.menuItem1.show