8

我希望我的基于视图的 NSTableview 不重用以前生成的滚动超出范围的 TableCellViews。我认为 UITableView 可以通过覆盖 dequeueReusableCellWithIdentifier: 返回 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 可能会返回我已经缓存的视图,因此表格内容会被错误的单元格弄乱。

这种方法的性能明显更好......

-

其他关于使滚动更高效的想法也得到了应用。

4

1 回答 1

11

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

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

科尔宾

于 2015-05-28T03:54:44.347 回答