objective-c - NSValueTransformer 没有被调用

标签 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,其内容数组绑定(bind)到共享用户默认 Controller , Controller 键 =“values”,模型键路径 =“menuItems”。我启用了“将内容作为复合值处理”。它的对象 Controller 模式是“Class”,它控制的类名是NSMutableDictionary。

期望的结果是将 NSMenuItems“隐藏”属性绑定(bind)到 plist 中的“显示”条目。不过,您会注意到,“隐藏”和“显示”是相反的,因此我创建了一个 NSValueTransformer,它的作用很简单:

return [NSNumber numberWithBool:!value];

我按如下方式设置绑定(bind),其中“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];

绑定(bind)似乎在一定程度上发挥了作用;菜单项最初显示或隐藏,但从未使用 valueTransformer,因此每个菜单项的“隐藏性”是向后的。 (顺便说一句,如果 plist 发生变化,菜单项“隐藏性”也不会自动更新,正如我对绑定(bind)所期望的那样。)

我错过了什么?

顺便说一句,我意识到在 plist 中存储“隐藏”而不是“显示”会更容易,但此时我想了解为什么这不起作用。

编辑:我的猜测是这与我试图绑定(bind)到 NSMutableDictionary 内的对象有关。如果是这样,正确的方法是什么?

最佳答案

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

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

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

关于objective-c - NSValueTransformer 没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6531281/

相关文章:

iphone - 在Core Data中,您可以在插入数据的同时从数据库中检索其他数据吗?

objective-c - 潜在的泄漏问题

macos - NSTableCellView 中具有绑定(bind)的自定义 View

ios - 从 xcode 中的 mainBundle 获取子目录

cocoa - 保持光标形状不变

objective-c - NSArray(和其他 Cocoa 类型)@property 值

objective-c - 如何在 Objective-C 中合并延迟/延迟的调用?

objective-c - 安全删除包含 cocoa 绑定(bind)的 NSView

objective-c - 将 NSPopupButton 索引绑定(bind)到多个 bool 值

iphone - 将 UIView/UIWindow 中的特定触摸事件传递给下一个响应者(sendEvent :/hitTest: doesn't work )