【发布时间】:2021-02-19 16:45:51
【问题描述】:
如何在应用快照后停止将视图滚动到顶部的 diffable 数据源。我现在有这个...
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
}
存储偏移量,然后重新应用它。有时它可以完美运行,有时视图会跳跃。有更好的方法吗?
【问题讨论】:
-
除非您最初填充集合视图(仅限第一次),否则不应创建新快照并应用它。您应该从数据源获取快照,对其进行修改并应用它。并且根本不要尝试使用内容偏移量。它只会更新到位。
-
您好,感谢您的评论,我已经更新了我的代码以向您展示我在做什么。所以我初始化它,然后应用快照。这是基于我下载的苹果示例,这不正确吗?
-
通过检索当前快照、修改它并在发生变化时应用它,我们将不得不管理两个真实来源,就像我们对 UITableViewDataSource 所做的那样。这样一来,我们将失去 Diffable Data Source 最重要的好处。所以这不是一个好方法。
-
同意@Amirreza,我认为 Diffable 数据源的目的,至少从它在 WWDC 中的营销方式来看,是您不必担心管理状态。该框架应该能够比较两个数据源并提供开箱即用的动画。我遇到了同样的问题。此外,我正在为不应该动画的单元格传递相同的自定义哈希标识符,但它们是。我以前使用过 IGListKit,所以我知道这不应该是预期的行为。
标签: ios swift diffabledatasource