【问题标题】:How to know when NSTableView is done (re)loading its contents?如何知道 NSTableView 何时完成(重新)加载其内容?
【发布时间】:2020-01-02 18:56:11
【问题描述】:

我有一个类似于邮件应用程序的 UI。左侧的表格视图,带有单列项目。选择左侧的其中一项时,右侧会显示有关该项目的详细信息。

当我的应用程序中发生需要重新加载左表视图中的数据的事件时,当前选择会丢失,然后右详细视图和左主视图不同步。

我希望解决这个问题的方法是,当需要重新加载表数据时,我会: 1.保存当前选中的项目 2.重新加载表数据 3. 处理让我知道重新加载何时完成的委托方法或通知。 4. 通过在表中的新项目列表中找到正确的项目来重新选择它。

不幸的是,我找不到任何方法来确定表何时完成重新加载。有没有。任何方法来解决这个问题,或者b。这个问题的更优雅的解决方案?

谢谢。


更新:如果我的问题不清楚,想象一下您在邮件应用程序中并且您选择了一些消息。该摘要单元格在左侧显示为选中状态,消息的详细信息显示在右侧。假设新邮件进来,在表格顶部显示为新单元格。您当前正在查看的消息是如何被保留而不是被取消选择的?

【问题讨论】:

  • 你不能在 [yourTableView reloadData] 调用后简单地选择正确的单元格吗?
  • 不幸的是没有(我也这么认为..)。 reloadData 仅设置一个位,指示表需要稍后重新加载。它实际上并没有在那个时候重新加载。所以问题是我实际上不知道重新加载何时完成。
  • 这对我来说听起来很奇怪,也与 Apple 的文档不一致。无论如何,请注意表格视图只会重新显示那些可见的行。
  • 定义一个方法(refreshTable),重新加载表格数据并重新选择单元格。然后将调用推迟到下一个run loop循环:[self.tableView performSelectorOnMainThread:@selector(refreshTable) withObject:nil waitUntilDone:NO];

标签: macos cocoa nstableview


【解决方案1】:

reloadData 有点像大锤。 10.7 提供了更好的解决方案。

当你有新的行要添加时,不要使用 reloadData,而是使用 insertRowsAtIndexes:withAnimation: 。当您有要删除的行时,请使用 removeRowsAtIndexes:withAnimation: 。当然,如果现有行已更改,则有reloadDataForRowIndexes:columnIndexes

这些应该为您记住选择(至少,iOS 上的等价物可以)。

如果您无法以 10.7 为目标,其他一些建议可能会有所帮助。 noteNumberOfRowsChanged 也可能有帮助,但我没有实际使用过。

【讨论】:

    【解决方案2】:

    您可以在tableView(_:shouldSelectRow:) 上保存选择,然后在创建单元格后立即选择行tableView(_:viewFor:row:) 中使用selectRowIndexes(_:byExtendingSelection:)

    无论您如何/何时/多少次重新加载表格,它都非常可靠。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多