我有一个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看到各种数据。
我尝试了很多东西:
这些都不会导致任何事情发生。但是,直接观察NSArrayController的arrangeObjects会触发observeValueForKeyPath:...但这与仅仅为了整个生猪并使用NSUserDefaultsDidChangeNotification真的没什么不同。
有没有办法通过绑定或KVO来解决这个问题,这会让我达到我正在寻找的细节水平?
答案 0 :(得分:0)
可以绑定MenuItem隐藏属性,它位于IB中的选项列表中。但是,您无法绑定到数组中的对象,现在可以说,实际上是array.object1。如果你让你的用户默认使用字典词典,我认为你可以做你想要的 - 顶层的键可以是“menuItem1”,“menuItem2”等,其值是一个包含你需要的所有其他键的字典。如果不知道您的用户默认值中还有其他内容,那么很难判断这是否可行。如果它可以工作,你可以使用valueForKeyPath获取你想要的信息:如dict.menuItem1.show