我使用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
这正确地看到单元格仍然可见,因此不会删除我的额外跟踪。但是,如果单元格可见,为什么要调用该方法?
显然我的应用程序中还有很多其他代码正在运行。我会尝试将其归结为一个非常简单的案例,但我想先发布一下,看看有没有人看到过这种情况会发生的情况。这可能有助于我追踪它。
感谢您的任何见解。
答案 0 :(得分:2)
我发现了这个问题,我发布了一个答案,以防其他人看到这个问题,并会得到我发现的帮助。
事实证明,我无意中在tableView.reloadRows(at: [indexPath], with: .fade)
和tableView.beginUpdates()
区域内留下了tableView.endUpdates()
。
我认为reloadRows
导致单元格被替换,这将导致didEndDisplayingCell
。并且,由于块内发生了一些更新,因此在tableView.endUpdates()
被调用后,这些更新会排队并发布。
删除reloadRows
调用解决了问题,所有问题都按预期进行。
答案 1 :(得分:0)
就我而言,这是因为每当我更改reloadData()
时,我都会调用centeredIndexPath
。确保您没有重新加载数据,因为所有单元格都会调用didEndDisplaying
(当您重新加载它时)。