iOS13 DiffableDataSource 无效参数不满足:indexPath ||忽略无效项目

iOS13 DiffableDataSource Invalid parameter not satisfying: indexPath || ignoreInvalidItems

我正在将我的集合视图转换为新的 iOS13 UICollectionViewDiffableDataSource...所以我需要按需更新单元格信息。

这是我的代码:

let snap = self.diffDataSouce.snapshot
snap?.reloadItems(withIdentifiers: [itemToUpdate]) //reload cell info
self.diffDataSouce.apply(snap, animatingDifferences: true)

但我得到 Invalid parameter not satisfying: indexPath || ignoreInvalidItems ...为什么? 我当前的 snap 包含 itemToUpdate 以及我的模型数组...

我认为这是因为 snap.indexOfItemIdentifier(itemToUpdate) returns 未找到 (NSNotFound)...但根据数据模型,这应该是不可能的。

你有什么提示吗?

您是否为您的模型实现了 static func ==?我在使用在所有属性之间评估相等性的结构时遇到了类似的问题

您的数据模型必须符合 HashableEquatable,以便差异算法可以跟踪快照之间的变化。

如果两个对象之间存在冲突问题,或者您以允许两个对象看起来与差异算法相等的方式实现了这些协议中的任何一个,您将得到运行时断言异常.

我会准确追踪您的模型对象是如何继承或实现这些协议的。

我 运行 在尝试重新加载已从我的快照中删除的项目时遇到了这个问题。这会给你带来相同或相似的错误。确保您的数据模型和快照同步以避免此错误。

就我而言,问题在于重新加载可哈希项。相反,我应该删除 hashable 项目并重新插入。以下是具体内容。

我的 diffable ItemIdentifierType 是 AnyHashable 类型,如:

var dataSource: UICollectionViewDiffableDataSource<AHashableEnum, AnyHashable>!

每当我想像本次交流的作者一样重新加载单个项目时,我就遇到了崩溃:

var currentSnapshot = dataSource.snapshot()
currentSnapshot.reloadItems([hashableItemThatGotUpdated])
dataSource.apply(currentSnapshot, animatingDifferences: true)

我意识到,由于 ItemIdentifierType 是 AnyHashable 类型,如果哈希值已更改,则不允许重新加载项目。因为新项的哈希值在当前快照中不存在,因此不可重新加载。相反,我应该从当前快照中删除旧项目并插入新的 Hashable 标识符:

var currentSnapshot = dataSource.snapshot()
currentSnapshot.insertItems(identifiers: [NewHashableItemIdentifier], beforeItem: OldHashableItemIdentifier)
currentSnapshot.deleteItems(identifiers: [OldHashableItemIdentifier])
dataSource.apply(currentSnapshot, animatingDifferences: true)