ios - 无效参数不满足:initialSnapshot.numberOfSections == initialSections.count
问题描述
在处理一个新项目时,我们的团队决定使用它UICollectionViewDiffableDataSource
来处理我们的集合视图。它工作正常,但我们通过带有 message 的在线工具记录了(不常见的)崩溃Invalid parameter not satisfying: initialSnapshot.numberOfSections == initialSections.count
。我们似乎无法在本地重现这一点。
崩溃发生在我们用新数据更新数据源的地方,特别是在dataSource.apply(snapshot)
. 我们不确定这是如何发生的,因为数据总是以相同的方式创建的。
具体来说,处理这个视图的单位决定放弃创建截面模型,而是决定使用Int
作为截面标识符,因为他们不想使用截面,只是显示项目。这是我以前从未见过的一件事,但它Int
满足标识符的要求,因此代码确实可以正确编译。
这是代码:
集合视图和数据源创建
这些变量位于以编程方式创建的 UIView 的类中。
var collectionView = UICollectionView(frame: .zero, collectionViewLayout: createCollectionViewLayout())
lazy var dataSource = UICollectionViewDiffableDataSource<Int, URL>(collectionView: collectionView, cellProvider: provideCell(_:indexPath:item:))
更新数据源
func updateUI() {
var snapshot = dataSource.snapshot()
snapshot.deleteAllItems()
snapshot.appendSections([0])
if let urls = viewModel?.imageUrls {
snapshot.appendItems(urls)
}
dataSource.apply(snapshot)
}
在我测试过的所有(生产)案例中,viewModel?.imageUrls
第一次调用时为空,然后在第二次调用时包含项目以及之后的所有调用。项目的数量通常不会改变。
我考虑过不使用dataSource.snapshot()
而是创建一个新的,那么我也不必deleteAllItems()
每次都打电话。但是,当我不确定这是否真的解决了问题时,我不想只是将其作为解决方案。
有没有人遇到过这样的问题?Int
使用 an作为部分标识符是否正确?坠机的其他原因可能是什么?
解决方案
我的猜测是,您只删除项目,并且每次向快照添加额外部分时,都会导致错误。因此,如果您的 Snapshot 已经有一个“0”部分,则无需每次都添加一个新部分。
在我的项目中,我每次都会创建一个新快照:
var snapshot = NSDiffableDataSourceSnapshot<Int, URL>()
snapshot.appendSections([0])
if let urls = viewModel?.imageUrls {
snapshot.appendItems(urls, toSection: 0)
}
customDataSource.apply(snapshot, animatingDifferences: animate)
WWDC 视频中使用了相同的方法。
推荐阅读
- angular - 添加到列表后,只有第一个新项目动画
- python - 可以计算一个列表中多个字符串的匹配吗?
- java - 从 Java 应用程序调用 getQueryResults 方法时,如何从 QueryResponse 访问 Schema?
- c# - 为插件调用 Swagger 生成器
- django - 禁用表单集表单域
- python - 将模型对象 ID 从模型复制到 Django 中的另一个模型
- c# - 使用 VS 2015 打开 VS 2017 项目时出现语法错误
- xamarin - Xamarin Prism 向右滑动区域更改或覆盖(两次向右滑动)
- flutter - Flutter 的 AutomaticKeepAliveClientMixin 在 navigator.push 之后不保持页面状态
- wordpress - 我将引导程序用于 wordpress 主题,但我的菜单项 deosnt 显示在移动视图中,否则没有问题