更新绑定到NSArrayController的表列

时间:2010-04-19 11:09:51

标签: objective-c cocoa cocoa-bindings nsarraycontroller

我对可可的绑定世界相当新,我遇到了一些麻烦(可能/可能是由于误解)。

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

同样在IB中是一个NSObjectController,其内容出口连接到单例。还有一个NSArrayController,其contentArray绑定到NSObjectController(控制器键是'选择',模型键路径是'插件',对象类名称是'插件')。

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

到目前为止这么标准(至少从教程中可以看出)。我的麻烦是,当在单例中调用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

3 个答案:

答案 0 :(得分:5)

通过触发相应的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

答案 1 :(得分:2)

我已经想到了这一点 - 这是 RTFM (和 Understanding-TFM )的经典案例。全部归结为ensuring KVC compliance

在PluginManager Singleton中,它有一个名为'plugins'的数组,我只需要实现:

-insertObject:inPluginsAtIndex:
-removeObjectFromPluginsAtIndex:

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

感谢帮助人员。

答案 2 :(得分:0)

  

有没有办法告诉你   引用的NSArrayController   数组已更新?

你不应该这样做。这就是关键价值观察的目的。它是整个绑定功能的基础。绑定对象(在本例中为interface元素)自动观察(接收通知)它所观察的对象已更改。您不应该手动告诉它已经发生了变化。如果表未更新,则绑定错误。

从文本描述中很难说,但我认为你的问题是你将NSObjectController设置为“选择”。只有在将另一个UI元素绑定到NSObjectController并且该元素选择控制器中的数据项时,这才有效。

您可以尝试写出类似的绑定:

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

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

(需要有一个标准,用于以文本方式表示绑定和核心数据关系,但我想我们会陷入困境。)