1

我是 Cocoa 编程的新手(但对其他 UI 框架比较有经验),并且在以下情况下无法准确判断我哪里出错了。

我有一个由 NSOutlineViewDataSource 包装的数据“树”。这些项目是非常基本的读/写(想想复选框)​​。然而,当

setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn byItem:(id)item

被调用时,我所做的更改不仅会影响有问题的单个项目,而且可以传播到其他项目,即检查一个项目可能会导致树中的其他项目选择或取消选择。在数据模型级别,我可以正常工作。我的问题是以某种方式强制刷新大纲,以便这些其他更改出现在 UI 中。

所以基本上,当调用 setObjectValue 时,被更改的单个单元格被刷新,但我需要(可能)整个树在 UI 中刷新。

做这样的事情的最佳实践机制是什么?NSOutlineView 上是否有我应该监听的事件然后触发刷新。我的 NSOutlineViewDataSource 是否应该引发视图侦听的事件?还是我的基本方法完全错误?

(我实际上是用 Monomac 做的,但我认为任何答案都适用于一般可可)

4

1 回答 1

1

Andrew - 最简单的方法是研究 KVO 编程。如果您要观看的特定项目符合 KVO,您可以使用“addObserver”在其上设置一个观察者然后在观察者类中实现委托函数“observeValueForKeyPath”,并在通知该函数时强制更改 UI改变你正在观看的价值。并非所有内容都符合 KVO,因此您的里程数会根据您想要监控更改的事物的性质而有所不同。但是,如果您正在查看自定义对象的属性,那么使用 KVO 肯定会很好。

KVO 编程指南在这里:

https://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html

于 2012-03-30T04:24:55.763 回答