我有我的共享用户默认plist,如下所示:
menuItems (Array)
Item 0 (Dictionary)
name (String) "Menu Item 0"
show (Boolean) NO
Item 1 (Dictionary)
name (String) "Menu Item 1"
show (Boolean) YES诸若此类。
我有一个NSArrayController,它将其内容数组绑定到共享用户默认控制器,其中controller Key = "values“,Model Key Path = "menuItems”。我启用了“将内容作为复合值处理”。它的对象控制器模式是“类”,它控制的类名是NSMutableDictionary。
期望的结果是将NSMenuItems的“隐藏”属性绑定到plist中的"show“条目。你会注意到,“隐藏”和“显示”是对立的,所以我创建了一个简单的NSValueTransformer:
return [NSNumber numberWithBool:!value];我按如下方式设置绑定,其中“NSMenuItem”是一个项目,"valueTransformer“是如上所述的已分配和初始化的转换器,paneNum是索引,可以在其中为相应的菜单项找到适当的字典:
NSDictionary *bindingOptions = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSContinuouslyUpdatesValueBindingOption,
valueTransformer, NSValueTransformerBindingOption,
nil];
[item bind:@"hidden"
toObject:[[defaultsController arrangedObjects] objectAtIndex:paneNum]
withKeyPath:@"show"
options:bindingOptions];绑定似乎在一定程度上起作用;菜单项最初是显示或隐藏的,但valueTransformer从未使用过,因此每个菜单项的“隐藏”都是反向的。(顺便说一句,如果plist发生变化,菜单项"hiddenness“也不会自动更新,就像我期望的绑定一样。)
我错过了什么?
顺便说一句,我意识到在plist中存储“隐藏”比“显示”要容易得多,但在这一点上,我想知道为什么这不起作用。
编辑:我的猜测是,这与我试图绑定到NSMutableDictionary中的对象有关。如果是这样的话,正确的方法是什么呢?
发布于 2011-07-01 13:18:45
我只是最终使用了NSNegateBooleanTransformerName (我今天找到的东西)。我将假设我的值转换器中有一些愚蠢的东西,或者它与试图绑定到NSMutableDictionary有关,这是我快速创建的一个不使用字典的示例项目。
编辑:这是我的转换器中的一些东西,因为NSNegateBooleanTransformer工作得很好,即使有字典在混合中也是如此。(无论如何,那里的冲突是没有意义的)。
我希望有人能解释为什么基于上面代码的值转换器(应该与NSNegateBooleanTransformer相同)不能工作,我会改变我的回答接受。
https://stackoverflow.com/questions/6531281
复制相似问题