如何使NSTableView不重用TableCellViews

时间:2013-02-11 10:57:37

标签: macos cocoa nstableview

我希望我的基于视图的NSTableview不会重复使用以前生成的滚动超出范围的TableCellViews。我认为这可以通过覆盖dequeueReusableCellWithIdentifier来使用UITableView:返回nil。我有类似的NSTableView解决方案吗?

-

我的背景:我有一个非常复杂的基于视图的tableView以通常的方式绑定到ManagedObjects(即table-content,-selection和-sortdescriptor绑定到arraycontroller,tableCellView-elements绑定到objectValue)。

该表有大约20列,但最多有400行。滚动速度非常慢,但时间分析表明没有单一的缓慢来源(最大的单一方法调用占用大约5%的时间)。在缓存了我的ManagedObject的派生/自定义属性而没有太多性能提升之后,我现在正在尝试缓存视图(以避免在视图进入范围时频繁重新绑定tablecellViews。)

我目前正在尝试的是不绑定表内容,而是使用NSDatasource协议获取我的视图。在

-(NSView*) tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row

我想返回缓存的TableCellViews(如果它们存在)。否则我通过

创建一个新的
[self.table makeViewWithIdentifier:... owner:self];

由于makeViewWithIdentifier可能会返回已经被我缓存的视图,因此表格内容会被错误的单元格搞乱。

采用这种方法,表现明显更好......

-

关于使滚动性能更高效的其他想法也很受欢迎。

1 个答案:

答案 0 :(得分:9)

在tableView:viewForTableColumn:implementation中,将返回视图上的.identifier设置为nil。这将阻止表缓存它。然后,您可以管理自己的缓存。 FWIW,你甚至不必使用makeViewWithIdentifier:就是这样;您可以从头开始手动创建视图,而不是使用该方法(从NIB加载预设置视图)。

但是,如果您遇到性能问题,最好通过查看缓慢和原因来解决这些问题。你没有提供有关它为什么慢的信息,所以很难说该怎么做。 20列是很多。尝试通过在NST​​ableCellView或NSTableRowView上使用canDrawSubviewsIntoLayer来减少图层数,可能会获得更好的性能。但是这样做有很多警告和注意事项。

卡宾