Loz*_*Loz 1 cocoa objective-c nsarraycontroller cocoa-bindings
我对可可的绑定世界相当新,我遇到了一些麻烦(可能/可能是由于误解).
我有一个包含一个名为plugins的NSMutableArray的单例,它包含类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
Run Code Online (Sandbox Code Playgroud)
作为一种有点hacky方式让它工作(通过触发相应的KVO通知),尝试:
[self willChangeValueForKey:@"plugins"];
[plugins addObject:somePlugin];
[self didChangeValueForKey:@"plugins"];
Run Code Online (Sandbox Code Playgroud)
代替
[plugins addObject:somePlugin];
Run Code Online (Sandbox Code Playgroud)
理想情况下,您应该在KVC支持上实现完全,然后您可以使用KVC触发KVO,这将触发Bindings更新.如果你这样做,你可以使用:
[self insertObject:somePlugin inPluginsAtIndex:0];
Run Code Online (Sandbox Code Playgroud)
关于什么是需要KVC合规的信息,请阅读本:http://developer.apple.com/mac/library/documentation/cocoa/conceptual/KeyValueCoding/Concepts/Compliant.html.
| 归档时间: |
|
| 查看次数: |
1479 次 |
| 最近记录: |