我对可可粘合剂的世界还很陌生,并且遇到了一些麻烦(也许/可能是由于误解)。

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

同样在IB中的是一个NSObjectController,其内容出口连接到单例。还有一个NSArrayController,其contentArray绑定到NSObjectController(控制器键为“ selection”,模型键路径为“ plugins”,对象类名称为“ Plugin”)。

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

到目前为止,一切都是标准的(至少从教程中可以看出)。我的麻烦是,当在单例中调用loadPlugins方法并将对象添加到plugins数组时,该表不会更新以显示对象(除非在装入笔尖之前调用了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

最佳答案

作为一种使它工作的方法有点怪(通过触发适当的KVO通知),请尝试放入:

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


代替

[plugins addObject:somePlugin];


理想情况下,您应该实现对KVC的完全支持,然后可以使用KVC触发KVO,这将触发绑定更新。如果这样做,则可以使用:

[self insertObject:somePlugin inPluginsAtIndex:0];


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

关于objective-c - 更新绑定(bind)到NSArrayController的表列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2666848/

10-10 23:50