我希望我的基于视图的NSTableview不重用以前生成的超出范围的TableCellViews。我认为通过覆盖dequeueReusableCellWithIdentifier:返回nil,可以使用UITableView实现。 Ist对于NSTableView有类似的解决方案吗?
--
我的背景:我有一个非常复杂的基于视图的tableView以通常的方式绑定到ManagedObjects(即table-content,-selection和-sortdescriptor绑定到arraycontroller且tableCellView-elements绑定到objectValue)。
该表大约有20列,但最多400行。滚动确实很慢,但是时间分析表明不存在唯一的慢速来源(最大的单个方法调用大约需要5%的时间)。在缓存了ManagedObject的派生/自定义属性而没有太多性能提升之后,我现在尝试缓存视图(以避免在视图进入作用域时频繁重新绑定tablecellViews)。
我目前正在尝试的是不绑定表内容,而是使用NSDatasource-protocol获取我的视图。在里面
-(NSView*) tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
我想返回缓存的TableCellViews(如果存在)。否则我通过创建一个新的
[self.table makeViewWithIdentifier:... owner:self];
由于makeViewWithIdentifier可能返回我已经缓存的视图,因此表内容被错误的单元弄乱了。
这种方法的性能明显更好。
--
还提出了其他使滚动效果更好的想法。
最佳答案
在tableView:viewForTableColumn:实现中,将返回视图上的.identifier设置为nil。这将阻止表对其进行缓存。然后,您可以管理自己的缓存。 FWIW,您根本不需要使用makeViewWithIdentifier:;您可以从头开始手动创建视图,而无需使用该方法(该方法会从NIB加载预设置视图)。
但是,如果您遇到性能问题,最好通过查看缓慢的原因以及原因来解决这些问题。您没有提供有关为何速度缓慢的信息,因此很难说该怎么办。 20列很多。通过尝试使用NSTableCellView或NSTableRowView上的canDrawSubviewsIntoLayer来减少层数,可能会获得更好的性能。但是在执行此操作时有很多注意事项和注意事项。
科宾