如何在应用快照后停止差异数据源将视图滚动到顶部。我现在有这个……
fileprivate func configureDataSource() {
self.datasource = UICollectionViewDiffableDataSource<Section, PostDetail>(collectionView: self.collectionView) {
(collectionView: UICollectionView, indexPath: IndexPath, userComment: PostDetail) -> UICollectionViewCell? in
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: PostDetailCell.reuseIdentifier, for: indexPath) as? PostDetailCell else { fatalError("Cannot create cell")}
cell.user = self.user
cell.postDetail = userComment
cell.likeCommentDelegate = self
return cell
}
var snapshot = NSDiffableDataSourceSnapshot<Section, PostDetail>()
snapshot.appendSections([.main])
snapshot.appendItems(self.userComments)
self.datasource.apply(snapshot, animatingDifferences: true)
}
fileprivate func applySnapshot() {
//let contentOffset = self.collectionView.contentOffset
var snapshot = NSDiffableDataSourceSnapshot<Section, PostDetail>()
snapshot.appendSections([.main])
snapshot.appendItems(self.userComments)
self.datasource.apply(snapshot, animatingDifferences: false)
//self.collectionView.contentOffset = contentOffset
}存储偏移量,然后重新应用它。有时它工作得很完美,有时视图会跳跃。有没有更好的方法来做这件事?
发布于 2020-11-12 17:35:27
这个问题的根源可能是您的项目标识符类型,即UserComment。Diffable数据源使用项目标识符类型的散列来检测它是新实例还是当前表示的旧实例。如果手动实现Hashable协议,并且使用在初始化该类型的新实例时生成的UUID,则会误导Diffable数据源,并告诉它这是项标识符的新实例。因此,必须删除以前的内容,并表示新的内容。这会导致表或集合视图在应用快照后滚动。要解决这个问题,请将uuid替换为您所知道的唯一类型的属性之一,或者更一般地,使用一种技术为相同的实例生成相同的散列值。
总而言之,一般的想法是将具有相同散列值的项标识符的实例传递给快照,以告诉Diffable数据源这些项不是新的,不需要删除以前的项并插入这些项。在这种情况下,您将不会遇到不必要的滚动。
发布于 2021-10-20 14:13:05
首先:在大多数情况下,@Amirrezas的答案将是问题的正确原因。在我的例子中,导致问题的不是项目,而是区段标识符。这是具有正确值的Hashable和Identifiable,但它是一个class,因此从未调用过哈希函数。我花了一段时间才发现这个问题。更改为结构(因此采用了一些东西;)对我的情况很有帮助。
作为参考,这里有一个指向苹果开发人员论坛主题的链接:https://developer.apple.com/forums/thread/657499
希望我的回答能对某些人有所帮助:)
https://stackoverflow.com/questions/64723283
复制相似问题