UITableView错误调用didEndDisplayingCell

时间:2017-04-20 16:48:25

标签: ios swift uitableview swift3

我使用UITableView的{​​{1}}方法遇到问题。我正在使用此方法和didEndDisplayingCell来处理我的表的一些额外数据跟踪。问题是willDisplayCell连续多次被调用,有时候实际上仍在显示单元格。我无法弄清楚为什么会发生这种情况。

更多详情

我正在使用NSFetchedResultsController为表提供数据。更改从另一个队列中的didEndDisplayingCell进入表中,然后合并到表使用的NSManagedObjectContext中。这一切似乎都很好。看看我对上述方法的实现:

NSManagedObjectContext

我在这里看到的输出是:

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    debugPrint("willDisplay cell at \(indexPath).")
    self.dataProvider.addTrackedRelatedRecords(for: indexPath)
}

override func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    debugPrint("didEndDisplaying cell at \(indexPath).")
    self.dataProvider.removeTrackedRelatedRecords(for: indexPath)
}

表格中的单元格仍然可见,并且永远不会消失。我无法看到任何可能导致调用 "Updating rows in table at [0, 0]". <=== This is an update to the data "willDisplay cell at [0, 0]." <=== This is what I expect "didEndDisplaying cell at [0, 0]" "didEndDisplaying cell at [0, 0]" "didEndDisplaying cell at [0, 0]" 的内容,尤其是重复调用。

我可以通过在didEndDisplaying方法中添加以下内容来检查单元格是否仍然可见,从而解决此问题:

didEndDisplayingCell

这正确地看到单元格仍然可见,因此不会删除我的额外跟踪。但是,如果单元格可见,为什么要调用该方法?

显然我的应用程序中还有很多其他代码正在运行。我会尝试将其归结为一个非常简单的案例,但我想先发布一下,看看有没有人看到过这种情况会发生的情况。这可能有助于我追踪它。

感谢您的任何见解。

2 个答案:

答案 0 :(得分:2)

我发现了这个问题,我发布了一个答案,以防其他人看到这个问题,并会得到我发现的帮助。

事实证明,我无意中在tableView.reloadRows(at: [indexPath], with: .fade)tableView.beginUpdates()区域内留下了tableView.endUpdates()

我认为reloadRows导致单元格被替换,这将导致didEndDisplayingCell。并且,由于块内发生了一些更新,因此在tableView.endUpdates()被调用后,这些更新会排队并发布。

删除reloadRows调用解决了问题,所有问题都按预期进行。

答案 1 :(得分:0)

就我而言,这是因为每当我更改reloadData()时,我都会调用centeredIndexPath。确保您没有重新加载数据,因为所有单元格都会调用didEndDisplaying(当您重新加载它时)。