2012-03-30 24 views
1

我是新来的Cocoa编程(但与其他UI框架相对有经验),并且无法确切地知道我在哪里出错 以下情况。如何更改NSOutlineViewDataSource触发刷新其他项目

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

setObjectValue:(ID)对象forTableColumn:(NSTableColumn *)TableColumn的byItem:(ID)项目

被调用时,改变我做影响的不只是问题的一个项目,但可以传播到其他项目,即检查一个项目可能会导致树中的其他项目选择或取消选择。在数据模型层面,我已经很好地工作了。我的问题是以某种方式强制轮廓刷新,以便这些其他更改显示在UI中。

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

做这种事情的最佳做法机制是什么?是否有一个NSOutlineView事件,我应该听,然后触发刷新。我的NSOutlineViewDataSource应该引发视图监听的事件吗?或者我的基本方法完全错误?

(我其实这样做有MONOMAC但我认为任何回答适用于可可一般)

回答

1

安德鲁 - 要做到这一点最简单的方法就是寻找到志愿编程。如果您要观看的特定项目符合KVO,您可以使用“addObserver”在其上设置观察器然后,在观察器类中实现委托函数“observeValueForKeyPath”,并可以在通知该函数时强制更改UI对您正在观看的价值进行更改。并非所有产品都符合KVO标准,因此您的行驶里程取决于您希望监控变化的事物的性质。但是,如果您正在观看自定义对象上的某个属性,那么使用KVO肯定会很好。

的志愿编程指南是在这里:

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

+0

所以控制器牵着我的大纲视图将被设置成为所有数据项观察者?然后它可以通过在大纲视图上调用reloadData()来触发刷新等,如果它觉得有必要的话? – 2012-03-30 04:29:39

+0

是的,这是一般的想法。您可以将“addObserver”设置为self,然后确保在该控制器中实现observeValueForKeyPath。 – 2012-03-30 12:26:47

相关问题