gpt4 book ai didi

objective-c - 更新绑定(bind)到 NSArrayController 的表列

转载 作者:行者123 更新时间:2023-12-03 16:50:59 26 4
gpt4 key购买 nike

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

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

IB 中还有一个 NSObjectController,其内容导出连接到单例。还有一个 NSArrayController,其 contentArray 绑定(bind)到 NSObjectController( Controller 键为“selection”,模型键路径为“plugins”,对象类名为“Plugin”)。

最后,我有一个包含 2 列的 TableView ,其值使用 Plugin 类中的属性键绑定(bind)到 NSArrayController 的排列对象。

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

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

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

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

提前致谢。

\编辑...

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

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

最佳答案

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

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

而不是

[plugins addObject:somePlugin];

理想情况下,您应该完全实现 KVC 支持,然后您可以使用 KVC 触发 KVO,从而触发绑定(bind)更新。如果你这样做了,你就可以使用:

[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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com