我有一个这样的数据源
fileprivate func makeRecordsDataSource() -> RecordsDataSource {
let dataSource = RecordsDataSource(
collectionView: recordsCollectionView,
cellProvider: { (collectionView, indexPath, recordItem) ->
UICollectionViewCell? in
switch recordItem.type {
case .Rep:
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: RepRecordCell.identifier, for: indexPath) as? RepRecordCell
cell!.configure(with: recordItem)
return cell
case .Image:
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: ImageRecordCell.identifier, for: indexPath) as? ImageRecordCell
cell!.configure(with: recordItem)
return cell
case .Video:
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: VideoRecordCell.identifier, for: indexPath) as? VideoRecordCell
cell!.configure(with: recordItem)
return cell
case .Text:
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: TextRecordCell.identifier, for: indexPath) as? TextRecordCell
cell!.configure(with: recordItem)
return cell
}
})
return dataSource
}
在我的视图控制器中
private lazy var recordsDataSource = makeRecordsDataSource()
然后是一个将快照应用到数据源的函数....
func applyRecordsSnapshot(days:[YearMonthDay]) {
var snapshot = RecordsDataSourceSnapshot()
snapshot.appendSections(days)
var i = 0
for ymd in days {
sectionMap[ymd] = i
snapshot.appendItems(ymd.recordItems,toSection: ymd)
i += 1
}
recordsDataSource.apply(snapshot, animatingDifferences: false)
}
在调试器中,当我查看snapshot.numberOfItems时,我看到4,因此有4个部分...但是由于某些原因,当我在闭包中放置断点时,从来没有调用过它。快照中的每个单元格不会调用一次吗?
2条答案
按热度按时间bhmjp9jg1#
本周我一直在学习diffable数据源和cell providers API,根据我的经验,看起来你做得很正确。
我注意到您使用的是传统的
dequeueReusableCell(withReuseIdentifier:for:)
方法。在过去,当我没有使用register my cell时,我也遇到过类似的问题。这是一个一行程序,通常与单元格创建分开,因此可能您正在执行此操作,只是为了清楚起见而省略了这一部分。
iOS 14.0手机注册
在我的项目中,我一直在使用新的UICollectionView.CellRegistration API,它更干净,而且都在一个地方。另外,不再需要重用标识符、预注册和可选的类型转换。以下是我如何配置collectionView和dataSource:
nafvub8i2#
老问题,但对我来说,问题是,我设置所有这些之前,
viewDidLoad
,所以collectionView没有准备好。检查您正在设置的生命周期的哪个部分,应该在viewDidLoad或之后。