Objective c 绑定到包含字典数组的NSUserDefaults

Objective c 绑定到包含字典数组的NSUserDefaults,objective-c,cocoa,nsuserdefaults,cocoa-bindings,Objective C,Cocoa,Nsuserdefaults,Cocoa Bindings,我有一个NSUserDefaults项,它是一个字典数组。此数组中的每个字典对应于一个对象,该对象定义了我关心的NSMenuItem属性。每个字典中的键/值属性之一是一个布尔值,用于定义菜单项是显示还是隐藏。此值的键为show。下面是一个直观的示例: MenuItems (Array) Item 0 (Dictionary) label (String) "Menu Item 1" show (Boolean) Y

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

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上的隐藏属性直接绑定到相应的show值。不幸的是,根据他的理论,隐藏的东西是不能被束缚的。但我还是试过了,我不确定我所做的会不会奏效。困难在于这是一个字典数组,我不清楚绑定在这里是如何工作的。我有一个绑定到sharedUserDefaults菜单项的NSArrayController,我可以在调试时通过arrangedObjects查看各种数据

我试过很多东西:

直接绑定到字典值 为每个字典创建包装NSObjectController并绑定到keypath content.show 通过addObserver:forKeyPath:options:context观察字典本身 如上所述,观察包装好的NSObjectController。 这些都不会导致任何事情发生。但是,直接观察NSArrayController的arrangedObjects会触发observeValueForKeyPath:。。。但这与使用NSUserDefaultsDidChangeNotification完全不同


有没有一种方法可以通过绑定或KVO来解决这一问题,从而让我了解我所要了解的详细程度?

MenuItem hidden属性可以绑定,它在IB中的选项列表中。但是,您不能绑定到数组中的对象,现在可以说,实际上是array.object1。我认为,如果您让您的用户默认设置为字典字典,那么您可以做您想做的事情—顶级的键可以是menuItem1、menuItem2等,其值是包含您需要的所有其他键的字典。如果不知道用户默认设置中还有什么,很难判断这是否有效。如果可以的话,你可以通过valueForKeyPath获得你想要的信息:比如dict.menuItem1.show

我猜NSObjectController方法不起作用的原因是它复制了数据,而没有绑定到原始用户默认数据。我在其他地方遇到一篇文章,导致我绑定到arrangedObjects.show的关键路径。除了observeValueForKeyPath:方法中的新值之外,这种方法是有效的,并且它会为数组中的每个条目调用,而不仅仅是更改的条目。我可以将原始索引作为有效的上下文传入,但由于它是为数组中的每个项调用的,因此效率相当低。我必须尝试一下。谢谢你的主意。令人伤心的是,我将另一个方向的工作表视图与复选框绑定到一个绑定到用户默认值的数组控制器。这就是为什么我对它为什么不朝这个方向工作感到困惑。但我想我也可以把它改成字典。