1

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

我有一个单例,其中包含一个称为插件的 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
4

3 回答 3

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

于 2010-04-19T13:28:58.107 回答
2

我已经弄清楚了 - 这是RTFM(和理解 TFM)的经典案例。一切都归结为确保 KVC 合规性

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

-insertObject:inPluginsAtIndex:
-removeObjectFromPluginsAtIndex:

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

谢谢你们的帮助。

于 2010-04-21T10:24:57.890 回答
0

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

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

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

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

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

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

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

于 2010-04-19T13:16:32.147 回答