Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 如何更改NSOutlineViewDataSource以触发刷新其他项_Cocoa_Monomac - Fatal编程技术网

Cocoa 如何更改NSOutlineViewDataSource以触发刷新其他项

Cocoa 如何更改NSOutlineViewDataSource以触发刷新其他项,cocoa,monomac,Cocoa,Monomac,我不熟悉Cocoa编程(但对其他UI框架比较有经验),不能确切地说出我的错误所在 以下情况 我有一个由NSOutlineViewDataSource包装的数据“树”。这些项目是非常基本的读/写(想想复选框)。但是,什么时候? setObjectValue:(id)对象forTableColumn:(NSTableColumn*)tableColumn byItem:(id)item 调用时,我所做的更改不仅会影响有问题的单个项,还会传播到其他项,即检查一个项可能会导致树中的其他项被选中或取消选中

我不熟悉Cocoa编程(但对其他UI框架比较有经验),不能确切地说出我的错误所在 以下情况

我有一个由NSOutlineViewDataSource包装的数据“树”。这些项目是非常基本的读/写(想想复选框)。但是,什么时候?

setObjectValue:(id)对象forTableColumn:(NSTableColumn*)tableColumn byItem:(id)item

调用时,我所做的更改不仅会影响有问题的单个项,还会传播到其他项,即检查一个项可能会导致树中的其他项被选中或取消选中。在数据模型级别,我已经很好地实现了这一点。我的问题是以某种方式强制刷新大纲,以便在UI中显示这些其他更改

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

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


(我实际上是在使用Monomac,但我认为任何答案都适用于cocoa)

Andrew-最简单的方法是研究KVO编程。如果要监视的特定项符合KVO,则可以使用“addObserver”在其上设置一个监视程序,然后在observer类中实现委托函数“observeValueForKeyPath”,并可以在通知该函数正在监视的值发生更改时强制对UI进行更改。并非所有内容都与KVO兼容,因此您的里程取决于您想要监控的更改的性质。但是,如果您正在查看自定义对象上的属性,那么使用KVO肯定很好

KVO编程指南如下:


Andrew-最简单的方法是研究KVO编程。如果要监视的特定项符合KVO,则可以使用“addObserver”在其上设置一个监视程序,然后在observer类中实现委托函数“observeValueForKeyPath”,并可以在通知该函数正在监视的值发生更改时强制对UI进行更改。并非所有内容都与KVO兼容,因此您的里程取决于您想要监控的更改的性质。但是,如果您正在查看自定义对象上的属性,那么使用KVO肯定很好

KVO编程指南如下:


那么持有我的大纲视图的控制器将被设置为所有数据项的观察者?然后,如果觉得有必要,它可以通过在大纲视图上调用reloadData()来触发刷新等?是的,这是一般的想法。您可以将“addObserver”设置为self,然后确保在该控制器中实现了observeValueForKeyPath。因此,持有我的大纲视图的控制器将被设置为所有数据项的观察者?然后,如果觉得有必要,它可以通过在大纲视图上调用reloadData()来触发刷新等?是的,这是一般的想法。您可以将“addObserver”设置为self,然后确保在该控制器中实现了observeValueForKeyPath。