ios NSDiffableDataSource -未调用CollectionView数据源上的cellProvider?

8qgya5xd  于 2023-07-01  发布在  iOS
关注(0)|答案(2)|浏览(98)

我有一个这样的数据源

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个部分...但是由于某些原因,当我在闭包中放置断点时,从来没有调用过它。快照中的每个单元格不会调用一次吗?

bhmjp9jg

bhmjp9jg1#

本周我一直在学习diffable数据源和cell providers API,根据我的经验,看起来你做得很正确。
我注意到您使用的是传统的dequeueReusableCell(withReuseIdentifier:for:)方法。在过去,当我没有使用register my cell时,我也遇到过类似的问题。

collectionView.register(RepRecordCell.self, forCellWithReuseIdentifier: RepRecordCell.identifier)

这是一个一行程序,通常与单元格创建分开,因此可能您正在执行此操作,只是为了清楚起见而省略了这一部分。

iOS 14.0手机注册

在我的项目中,我一直在使用新的UICollectionView.CellRegistration API,它更干净,而且都在一个地方。另外,不再需要重用标识符、预注册和可选的类型转换。以下是我如何配置collectionView和dataSource:

let makeItemCell = UICollectionView.CellRegistration<UICollectionViewCell, Item> { cell, indexPath, item in
    cell.contentConfiguration = UIHostingConfiguration {
        ItemView(item) // A SwiftUI View
    }
}

let collectionView: UICollectionView = // 
let dataSource = UICollectionViewDiffableDataSource<Int, Item>(collectionView: collectionView) { collectionView, indexPath, item in
    collectionView.dequeueConfiguredReusableCell(using: makeItemCell, for: indexPath, item: item)
}
nafvub8i

nafvub8i2#

老问题,但对我来说,问题是,我设置所有这些之前,viewDidLoad,所以collectionView没有准备好。检查您正在设置的生命周期的哪个部分,应该在viewDidLoad或之后。

相关问题