首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >刷新后停止可区分数据源滚动到顶部

刷新后停止可区分数据源滚动到顶部
EN

Stack Overflow用户
提问于 2020-11-07 08:28:27
回答 2查看 1.8K关注 0票数 2

如何在应用快照后停止差异数据源将视图滚动到顶部。我现在有这个……

代码语言:javascript
复制
    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
    }

存储偏移量,然后重新应用它。有时它工作得很完美,有时视图会跳跃。有没有更好的方法来做这件事?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-12 17:35:27

这个问题的根源可能是您的项目标识符类型,即UserComment。Diffable数据源使用项目标识符类型的散列来检测它是新实例还是当前表示的旧实例。如果手动实现Hashable协议,并且使用在初始化该类型的新实例时生成的UUID,则会误导Diffable数据源,并告诉它这是项标识符的新实例。因此,必须删除以前的内容,并表示新的内容。这会导致表或集合视图在应用快照后滚动。要解决这个问题,请将uuid替换为您所知道的唯一类型的属性之一,或者更一般地,使用一种技术为相同的实例生成相同的散列值。

总而言之,一般的想法是将具有相同散列值的项标识符的实例传递给快照,以告诉Diffable数据源这些项不是新的,不需要删除以前的项并插入这些项。在这种情况下,您将不会遇到不必要的滚动。

票数 3
EN

Stack Overflow用户

发布于 2021-10-20 14:13:05

首先:在大多数情况下,@Amirrezas的答案将是问题的正确原因。在我的例子中,导致问题的不是项目,而是区段标识符。这是具有正确值的HashableIdentifiable,但它是一个class,因此从未调用过哈希函数。我花了一段时间才发现这个问题。更改为结构(因此采用了一些东西;)对我的情况很有帮助。

作为参考,这里有一个指向苹果开发人员论坛主题的链接:https://developer.apple.com/forums/thread/657499

希望我的回答能对某些人有所帮助:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64723283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档