问题描述
给出两个符合RandomModelObject
的数组,它们符合Codable,Equatable和Hashable,我想计算它们之间的差异并为UICollectionView中的内容更改设置动画。必须支持iOS 11使得我选择https://github.com/tonyarnold/Differ作为这样做的依赖。
此代码:
class ScreenNameCollectionViewDataSource {
var elements: [RandomModelObject] = []
}
extension ScreenNameViewController: ScreenNameviewmodelDelegate {
func elementsstoreUpdated() {
collectionView.animateItemAndSectionChanges(oldData: dataSource.elements,newData: viewmodel.blablabla,updateData: {
dataSource.elements = viewmodel.blabla
})
}
}
产生2个错误:
Instance method 'animateItemAndSectionChanges(oldData:newData:indexPathTransform:sectionTransform:updateData:completion:)' requires that 'RandomModelObject.Element' conform to 'Equatable'
Instance method 'animateItemAndSectionChanges(oldData:newData:indexPathTransform:sectionTransform:updateData:completion:)' requires that 'RandomModelObject' conform to 'Collection'
错误似乎没有指向我任何地方-数组是一个集合,并且该模型符合Equatable。我在那里想念任何东西吗?
解决方法
您正在使用animateItemAndSectionChanges
,这不仅要求T
是Collection
,而且还要求T
的元素是Collection
。换句话说,T
必须类似于2D数组。
这是因为animateItemAndSectionChanges
同时处理行和节。 2D集合将告诉该方法新旧的行和节是什么。每个“内部”集合都代表一个部分。
由于您的数据源是一维数组,因此似乎只需要animateRowChanges
(用于单节表视图)即可。
如果每个RandomModelObject
实际上代表一个 section ,那么您需要将其中的每个map
放入一个数组中,以便得到一个[[Something]]
,并相应地更改updateData
闭包。