更改快照 animatedDifferences 值时如何处理不一致的行为?
How to deal with inconsistent behavior when change snapshot animatedDifferences value?
我将从解释事情应该如何运作开始:
我有带组合布局和可区分数据源的集合视图。
单元格代表任务,用户可以点击并设置为今天完成,
单元格具有不同的外观,具体取决于它是否设置为完成,单元格检查 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)
}
看看:动画差异:false(左)和 true(右)
总而言之,我的目标是:
1) 动画单元格和 2) 在设置为完成时更改了外观。
似乎 animatingDifferences: false
我只能有 目标 2 而 animatingDifferences: true
只能有 目标 1
我已经尝试研究这个主题并发现了一些关于两次应用快照的东西,一次用于部分,一次用于项目,但它没有任何区别。
谁能指出我在这里遗漏了什么?
经过进一步调查并根据此处的评论:
当其参数 animatingDifferences
具有不同的值时,apply(snapshot: 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()
}
}
}
我将从解释事情应该如何运作开始:
我有带组合布局和可区分数据源的集合视图。
单元格代表任务,用户可以点击并设置为今天完成, 单元格具有不同的外观,具体取决于它是否设置为完成,单元格检查 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)
}
看看:动画差异:false(左)和 true(右)
总而言之,我的目标是:
1) 动画单元格和 2) 在设置为完成时更改了外观。
似乎 animatingDifferences: false
我只能有 目标 2 而 animatingDifferences: true
只能有 目标 1
我已经尝试研究这个主题并发现了一些关于两次应用快照的东西,一次用于部分,一次用于项目,但它没有任何区别。
谁能指出我在这里遗漏了什么?
经过进一步调查并根据此处的评论:
当其参数 animatingDifferences
具有不同的值时,apply(snapshot: 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()
}
}
}