NSValueTransformer未被调用

时间:2011-06-30 07:20:39

标签: objective-c cocoa cocoa-bindings

我的共享用户默认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中的对象这一事实有关。如果是这样的话,那么正确的方法是什么?

1 个答案:

答案 0 :(得分:1)

我刚刚结束使用NSNegateBooleanTransformerName(我今天发现的东西)。我将假设在我的价值转换器中有一些愚蠢的东西,或者它与尝试绑定到NSMutableDictionary作为一个示例项目我没有使用字典工作正常。

编辑:这是我的变换器中的东西,因为NSNegateBooleanTransformer工作正常,即使混合中的字典。 (无论如何,那里的冲突都没有意义。)

我喜欢有人解释为什么基于上面代码的值变换器(应该与NSNegateBooleanTransformer相同)不起作用,我会改变我的答案接受。