【问题标题】:NSValueTransformer not being calledNSValueTransformer 没有被调用
【发布时间】: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


【解决方案1】:

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

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

我希望有人解释为什么基于上述代码的值转换器(应该与 NSNegateBooleanTransformer 相同)不起作用,我会更改我的答案接受度。

【讨论】:

  • 我看不到你的转换器的所有代码,所以这是一个猜测。在您原来的方法中,您正在否定“价值”。但不是类型 id 的值吗?不是必须先转换为布尔值,然后否定布尔值,然后再转换回数字吗?
  • 感谢您的评论。那可能是罪魁祸首!不幸的是,我再也无法访问该代码来检查了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 2019-03-31
  • 2012-12-16
  • 2015-03-28
相关资源
最近更新 更多