应用新快照时如何避免 uicollectionview 取消选择所有项目?

How to avoid uicollectionview deselect all items when new snapshot is applied?

当我调用 dataSource?.apply(snapshot, animatingDifferences: true) 时,相关的 UICollectionView 取消选择所有单元格。

这是在后台接收新数据时出现的问题,因为当提交此更改时,用户会看到其当前选择消失。

如何避免在调用 apply(snapshot: animatingDifferences) 时取消选择所有 collection 项?

经过一番挖掘,我找到了问题的根源,它在Apple的代码中。至少,我将其称为“未记录的功能”,有些人可能会说这是一个错误。

应用快照时,UICollectionViewDiffableDataSource 的行为不同,无论 ItemIdentifierType 是值类型还是引用类型。

当然,你的ItemIdentifierType必须符合Hashable,但是调用apply(snapshot, animatingDifferences: true)时:

  • 如果ItemIdentifierType是一个值类型(结构),那么,它的==hash函数被调用,为了比较新收到的快照的项目当前显示的快照的项目,它允许找到差异,动画差异,并保留选择(如果有的话)(这是我寻求帮助的原始问题)。
  • 如果ItemIdentifierType是一个引用类型(class),那么,它的==hash函数是不是 被调用,这意味着新快照和当前显示的快照的项目与裸引用相等(指针是否相等)进行比较。因此,如果您使用具有相同哈希值的新实例“从头开始”构建项目,则比较总是错误的,并且您得不到动画,并且您失去了选择。

在这种情况下,一个简单的解决方法是将您的引用类型封装到一个结构中,它将 ==hash 转发给 class,并使用它结构为 ItemIdentifierType