2010-01-11 52 views
1

我有一个NSTableView显示(通过绑定)来自NSTreeController的数据。应用程序经常将数据附加到/将数据更改到绑定数组中。NSTableView。如何覆盖自动滚动行为?

问题是,如果用户选择了表格中的一行,但已滚动以便所选数据不再可见,那么当应用程序更新数组时,它会使显示器自动滚动,以便所选线再次在屏幕上。这对用户来说非常令人沮丧,尤其是因为新数据可以随时到达。

有什么办法可以禁用这个功能吗?

回答

2

您可能必须继承子类NSTableView并覆盖-scrollRowToVisible:,暂时将呼叫包含在super中。这可能还需要在您的子类中使用自定义的BOOL ivar来跟踪您是否要滚动。

我会从那里设置一个断点开始,看看自动滚动的触发时间。这应该有助于找到切换伊娃的适当时机。

+0

据我所知,Costique的解决方案是目前解决此问题的唯一方法。这是不幸的,因为如果你简单地覆盖'-scrollRowToVisible:'而不调用super的实现,其他事情就会中断。在我的情况下,我不得不修改我的网络代码以添加类方法'+ isInsertingNewDataFromRemote',然后让我的定制表视图在'-scrollRowToVisible:'内检查该标志,并且只在该标志为'NO'时才调用超级实现。 – Mason 2012-01-23 05:24:31

0

您是否用NSTreeControllerNSOutlineViewNSArrayControllerNSTableView?使用NSTreeControllerNSTableView对我来说没有多大意义?

如果您使用的是NSTableView,则应该使用NSArrayController来管理其数据,并且这种行的重新排列是NSArrayController的一项功能。尝试在IB内关闭控制器上的自动重新排列内容选项。

当它打开时,数组控制器将重新排列对象的添加,删除和更改,这些对象会影响排序顺序(如果有的话)并导致任何表视图或大纲视图重新加载其数据。

我不知道NSTreeController的一个类似功能,主要是因为我没有使用它,因为它对我来说工作不好。不幸的是,我建议只使用NSOutlineView的数据源方法,并以传统的方式提供数据。根据我的经验,NSTreeController只适合最琐碎的任务。

+0

NSTreeController在10.7中有很大提升;现在比以前的版本更有用。 – Mason 2012-01-23 05:29:15