【问题标题】:Update table columns bound to NSArrayController更新绑定到 NSArrayController 的表列
【发布时间】:2010-04-19 11:09:51
【问题描述】:

我对可可绑定的世界还很陌生,我遇到了一些麻烦(可能/可能是由于误解)。

我有一个单例,其中包含一个称为插件的 NSMutableArray,其中包含类插件的对象。它有一个名为 loadPlugins 的方法,可以将对象添加到 plugins 数组中。这可以在任何时候调用。它已作为实例添加到 Interface Builder 中。

在 IB 中还有一个 NSObjectController,它的内容出口连接到单例。还有一个NSArrayController,它的contentArray绑定到NSObjectController(controller key是'selection',model key path是'plugins',object class name是'Plugin')。

最后我有一个包含 2 列的表格视图,其值使用 Plugin 类中的属性键绑定到 NSArrayController 的排列对象。

到目前为止是标准的(至少从教程中我可以看出)。我的问题是,当在单例中调用 loadPlugins 方法并将对象添加到 plugins 数组时,表格不会更新以显示对象(除非在加载 nib 之前调用 loadPlugins)。在 tableView 上调用 -reloadData 不会做任何事情。

有没有办法告诉 NSArrayController 引用的数组已经更新?我知道有 NSArrayController 的 -add: 方法,可以在 loadPlugins 中使用,但这是不可取的,因为我想让单例与显示方面完全分开。

这似乎与: Refresh Cocoa-Binding - NSArrayController - ComboBox

这行:“在控制器背后编辑数组”似乎可以指出问题所在,但我希望单例可以不知道控制器。

提前致谢。

\编辑...

根据 TechZen 的建议,绑定如下:

TableColumn --('arrangedObjects', 'pluginName', Value)--> NSArrayController
NSArrayController --('selection', 'plugins', ContentArray)--> NSObjectController
NSObjectController --(content)--> PluginsManager

【问题讨论】:

    标签: objective-c cocoa cocoa-bindings nsarraycontroller


    【解决方案1】:

    作为一种让它工作的有点老套的方法(通过触发适当的 KVO 通知),尝试输入:

    [self willChangeValueForKey:@"plugins"];
    [plugins addObject:somePlugin];
    [self didChangeValueForKey:@"plugins"];
    

    代替

    [plugins addObject:somePlugin];
    

    理想情况下,您应该完全支持 KVC,然后您可以使用 KVC 触发 KVO,这将触发 Bindings 更新。如果你这样做了,你可以使用:

    [self insertObject:somePlugin inPluginsAtIndex:0];
    

    有关 KVC 合规性要求的信息,请阅读:http://developer.apple.com/mac/library/documentation/cocoa/conceptual/KeyValueCoding/Concepts/Compliant.html

    【讨论】:

      【解决方案2】:

      我已经弄清楚了 - 这是 RTFM(和 Understand-TFM)的经典案例。全部归结为ensuring KVC compliance

      在具有名为“插件”的数组的 PluginManager Singleton 中,我只需要实现:

      -insertObject:inPluginsAtIndex:
      -removeObjectFromPluginsAtIndex:
      

      然后在我想添加/删除插件时使用这些方法。

      感谢大家的帮助。

      【讨论】:

      • 这非常有用。感谢您回答自己的问题——这对我来说是一大步。
      【解决方案3】:

      有没有办法告诉 所引用的 NSArrayController 数组更新了吗?

      你不应该这样做。这就是键值观察的目的。它是整个绑定功能的基础。绑定对象(在本例中为界面元素)自动观察(接收通知)它观察到的对象已更改。您永远不必手动告诉它发生了更改。如果表没有更新,则绑定错误。

      很难从文字描述中分辨出来,但我认为您的问题是您将 NSObjectController 设置为“选择”。仅当您将另一个 UI 元素绑定到 NSObjectController 并且该元素选择了控制器中的数据项时,这才有效。

      你可以试着写出类似这样的绑定:

      Object1--(controller key, key path, class)--> Object2 
      Object2--(controller key, key path, class)--> Object3
      

      您可能会看到问题,如果您发布它,我们其他人也可以理解它。

      (需要有一个标准来用文本表示绑定和核心数据关系,但我想我们会糊里糊涂。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-14
        • 1970-01-01
        相关资源
        最近更新 更多