【发布时间】:2020-02-12 02:54:10
【问题描述】:
我将新的 NSDiffableDataSourceSnapshot 和 UITableViewDiffableDataSource 与 UITableView 一起使用。我在构建表格时没有问题,但是当单元格中显示的数据发生变化时,我在更新单元格时遇到了问题。我还没有找到任何解释如何执行此操作的 Apple 文档。我尝试了以下方法:
self.currentSnapshot.reloadItems([Item(identifier: identifier)])
self.dataSource.apply(self.currentSnapshot)
我在 reloadItems 中收到以下错误:
-[__UIDiffableDataSourceSnapshot 中的断言失败 _reloadViewUpdatesForDiffUpdate:dataSource:ignoreInvalidItems:]
我已检查传递给 Item 初始化程序的标识符是否已存在于快照中。
这是我的 Item 类:
class Item: Hashable, Equatable {
let identifier: String
var matchWrapper: MatchWrapper
init(matchWrapper: MatchWrapper) {
self.identifier = matchWrapper.identifier
self.matchWrapper = matchWrapper
}
func hash(into hasher: inout Hasher) {
hasher.combine(self.identifier)
}
static func == (lhs: ScoresViewController.Item, rhs: ScoresViewController.Item) -> Bool {
return lhs.identifier == rhs.identifier
}
}
有什么建议吗?
【问题讨论】:
-
我知道这个问题有点老了,但我想我会插话的。我不建议为您的项目标识符使用类。这会给你带来麻烦,因为它们是引用类型。这可能是您崩溃的原因,但如果不查看您修改数据的方式/位置,就很难判断。此外,您要确保对要在单元格中显示的所有字段进行散列和比较 (==)。这是数据源知道任何字段已更改的唯一方法。如果您有更多问题,请告诉我。
-
@RobertCrabtree 你的意思是在这种情况下
matchWrapper必须是散列和==运算符的一部分吗?当预期结果是更新现有项目时,这不会导致数据源识别“更新”对象,其中只有 matchWrapper 的内容已更改为新项目?
标签: uitableview