【问题标题】:What's the NSView version of NSTableView -noteNumberOfRowsChanged?NSTableView -noteNumberOfRowsChanged 的​​ NSView 版本是什么?
【发布时间】:2019-04-05 11:34:10
【问题描述】:

NSTableView -noteNumberOfRowsChanged documentation 说:

注意:在使用基于 NSView 的表视图时,应避免使用此方法。该表将在数据源中查询新的行数,并根据需要通过动画在表的末尾正确插入(或删除)行。

不幸的是,它没有说明我应该改用什么!

我已将我的应用程序从基于 NSCell 的表格更改为基于 NSView 的表格,以便使用(稍微)更复杂的自定义单元格(据说更容易设计/绘制为 NSViews),但我发现严重的性能问题,即使在小表上也是如此。

我已经在调用 -reloadDataForRowIndexes:columnIndexes:,并且凭经验这不足以让它重新查询 -numberOfRowsInTableView(并且它给出了一个范围异常,试图绘制一个大于先前报告的行数的行)。

有我应该调用的方法吗?还是基于 NSView 的表根本不适用于经常添加行的性能关键表?

【问题讨论】:

  • 可以使用基于视图的表来保持高性能。为您的数据源和委托方法提供更多信息或粘贴代码。
  • aneesh171:我稍后会尝试整理一个示例项目,但即使不考虑性能,我应该调用什么? Apple 的 API 明确表示不要使用这种方法,而且我没有看到其他类似的方法。
  • 如果你想调用委托/数据源方法,那么你可以调用reloadData,它会调用方法来重新加载所有可见的行。当您滚动时,将为现在可见的行调用委托/数据源方法。理解这一点的最好方法是在这些方法中放入一些 NSLog(或您用来记录消息的任何类)。

标签: macos cocoa nstableview


【解决方案1】:

实际上,我仍在使用func noteNumberOfRowsChanged() 和基于 NSView 的 tableview,它按计划完美运行。如果不使用这种方法,基于 NSView 的 tableview 会被破坏。 NSTableView 很烂,它的文档也很烂。

这就是我将这种方法用于基于 NSView 的 NSTableView 的方式:

self.pTableView.noteNumberOfRowsChanged()
self.pTableView.reloadData(forRowIndexes: set, columnIndexes: IndexSet.init(integer: 0))

【讨论】:

  • 我同意 NSTableView 在没有这种方法的情况下会被破坏。如果我没有此方法,则无法在没有(非常有问题的)动画和保留选择的情况下执行部分插入/删除/重新加载。
【解决方案2】:

如果我排除noteNumberOfRowsChanged,则剩下的只有reloadData

但不推荐这样做,因为它会强制重新创建所有单元格视图,因此会降低性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 2013-11-25
    • 2010-11-22
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    相关资源
    最近更新 更多