8

我正在将我的集合视图转换为新的 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)找不到返回(NSNotFound)......但根据数据模型这应该是不可能的。

你有什么提示吗?

4

4 回答 4

4

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

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

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

于 2020-01-17T15:23:20.810 回答
1

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

于 2019-12-07T14:00:30.087 回答
1

就我而言,重新加载可散列项是问题所在。相反,我应该删除可散列项并重新插入。以下是具体情况。

我的 diffableItemIdentifierType是 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)
于 2020-09-09T20:07:08.200 回答
0

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

于 2020-01-22T07:17:22.183 回答