【发布时间】:2011-07-08 15:19:49
【问题描述】:
我的共享用户默认 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"。我启用了“将内容作为复合值处理”。它的Object Controller Mode是“Class”,它控制的Class Name是NSMutableDictionary。
期望的结果是将 NSMenuItems 的“隐藏”属性绑定到 plist 中的“显示”条目。不过,您会注意到,“隐藏”和“显示”是相反的,所以我创建了一个 NSValueTransformer,它只是这样做:
return [NSNumber numberWithBool:!value];
我按如下方式设置绑定,其中“item”是一个 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 发生变化,菜单项“隐藏”也不会自动更新,正如我对绑定所期望的那样。)
我错过了什么?
顺便说一句,我意识到在 plist 中存储“隐藏”而不是“显示”会更容易,但此时我想了解为什么这不起作用。
编辑:我的猜测是这与我试图绑定到 NSMutableDictionary 中的对象有关。如果是这样,正确的做法是什么?
【问题讨论】:
-
您是如何创建
NSValueTransformer的?你在注册它的名字吗? -
因为我正在创建和实例化(只是 alloc/init)并使用 NSValueTransformerBindingOption 我认为我不需要注册它的名称。我认为只有在使用 NSValueTransformerNameBindingOption 时才需要这样做。两种方法我都试过了,我的名字注册成功了,我可以通过NSValueTransformer查到,但是还是不行。
标签: objective-c cocoa cocoa-bindings