我的共享用户默认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“hidden”属性被绑定到plist中的“show”条目。你会注意到,“隐藏”和“显示”是对立的,所以我创建了一个NSValueTransformer,它只是这样做:
return [NSNumber numberWithBool:!value];
我按如下方式设置绑定,其中“item”是NSMenuItem,“valueTransformer”是如上所述的alloc'ed和init'ed变换器,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中的对象这一事实有关。如果是这样的话,那么正确的方法是什么?
答案 0 :(得分:1)
我刚刚结束使用NSNegateBooleanTransformerName(我今天发现的东西)。我将假设在我的价值转换器中有一些愚蠢的东西,或者它与尝试绑定到NSMutableDictionary作为一个示例项目我没有使用字典工作正常。
编辑:这是我的变换器中的东西,因为NSNegateBooleanTransformer工作正常,即使混合中的字典。 (无论如何,那里的冲突都没有意义。)
我喜欢有人解释为什么基于上面代码的值变换器(应该与NSNegateBooleanTransformer相同)不起作用,我会改变我的答案接受。