3

我将从解释事情如何工作开始:

我有具有组合布局和可区分数据源的集合视图。

单元格代表任务,用户可以单击并将其设置为今天已完成,单元格具有不同的外观,具体取决于其是否设置为已完成,并且单元格检查 CoreData 以了解它是否已完成。

现在我试图实现一个想法,即一天完成的任务进入视图的底部,因此顶部只有那些仍然必须完成的任务。为此,我为我的获取请求设置了排序描述符。

直到那一刻一切都按预期工作,但我想让这个单元格向下移动,所以我 dataSource.apply(snapshot, animatingDifferences: false)改为true

现在它的动画但单元格在设置为完成时不会改变外观。

这是我的 setupSnapshot 方法():

func setupSnapshot() {
    snapshot = NSDiffableDataSourceSnapshot<Section, Task>()
    snapshot.appendSections([.main])
    snapshot.appendItems(fetchedResultsController.fetchedObjects ?? [])
    dataSource.apply(snapshot, animatingDifferences: true)   
}

看看: animatingDifferences: false(left) and true(right)

动画差异:假 动画差异:真

总而言之,我的目标是:

1)动画单元格和2)设置为完成时更改外观。似乎 with animatingDifferences: falsei 只能有目标 2而 withanimatingDifferences: true只能有目标 1

我已经尝试研究过这个主题,并发现了两次应用快照的方法,一次用于部分,一次用于项目,但没有任何区别。

任何人都可以指出我在这里缺少什么?

4

1 回答 1

3

经过进一步调查并根据此处的评论:

如何从 iOS 13 中的 NSFetchResultsController 获取可区分的快照?

apply(snapshot: animatingDifferences:)当其参数animatingDifferences具有不同的值时,行为会有所不同。

似乎animatingDifferences: false有 reloadData() 在引擎盖下进行,但没有发生animatingDifferences: true,至少根据这些评论及其与我的经验一致。

因此,我的代码的解决方案是将 setupSnapshot 调整为:

func setupSnapshot(animated: Bool) {
      snapshot = NSDiffableDataSourceSnapshot<Section, Task>()
      snapshot.appendSections([.main])
      snapshot.appendItems(fetchedResultsController.fetchedObjects ?? [])   
      dataSource.apply(snapshot, animatingDifferences: animated) {
         if animated {
            self.collectionView.reloadData()
         }
      }
}
于 2020-04-27T07:50:18.313 回答