具有多种数据类型的 CollectionView 组合布局

Posted

技术标签:

【中文标题】具有多种数据类型的 CollectionView 组合布局【英文标题】:CollectionView Compositional Layout with Multiple Data Types 【发布时间】:2020-07-18 07:29:02 【问题描述】:

我正在使用 Diffable DataSource 使用组合布局,到目前为止我很喜欢它。但我所有的努力都包含了一种类型的数据项。

我想要实现的是有两种不同类型的列表,比如CarAirplane

到目前为止,我所做的是创建布局,创建了 Enum

enum DataItem: Hashable
    case cars(Car)
    case airplane(Airplane)

dataSource初始化:

func configureDataSource()
    dataSource = UICollectionViewDiffableDataSource
    <Section, DataItem>(collectionView: collectionView) 
        (collectionView: UICollectionView, indexPath: IndexPath, dataItem: DataItem) -> UICollectionViewCell in
        
        switch dataItem 
        case .cars(let car):
            guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CarCell.reuseIdentifier, for: indexPath) as? CarCell else fatalError("Couldn't Create New Cell")
            ....
            return cell
        case .airplanes(let airplane):
            guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: AirplaneCell.reuseIdentifier, for: indexPath) as? AirplaneCell else 
                fatalError("Couldn't Create New Cell")
            
            ....
            return cell
        
    
    dataSource.apply(snapshotForCurrentState(), animatingDifferences: false)

现在我卡住的部分是创建快照。

理想情况下我想做的是

func snapshotForCurrentState() -> NSDiffableDataSourceSnapshot<Section, DataItem>
    var snapshot = NSDiffableDataSourceSnapshot<Section, DataItem>()
    snapshot.appendSections(Section.allCases)
    snapshot.appendItems([cars], toSection: Section.cars)
    snapshot.appendItems([airplanes], toSection: Section.airplanes)
    return snapshot

我在这里错过了什么?

【问题讨论】:

【参考方案1】:

你走在正确的道路上。您缺少的部分是您需要使用您创建的聚合类型创建快照,DataItem

func snapshotForCurrentState() -> NSDiffableDataSourceSnapshot<Section, DataItem>
    var snapshot = NSDiffableDataSourceSnapshot<Section, DataItem>()
    snapshot.appendSections(Section.allCases)

    let carItems = cars.map  DataItem.car($0) 
    snapshot.appendItems(carItems, toSection: Section.cars)

    let airplaneItems = airplanes.map  DataItem.airplane($0) 
    snapshot.appendItems(airplaneItems, toSection: Section.airplanes)
    return snapshot


【讨论】:

以上是关于具有多种数据类型的 CollectionView 组合布局的主要内容,如果未能解决你的问题,请参考以下文章

具有多种数据类型的 FHIR 数据元素

具有多个单元格模板的 CollectionView(使用未声明的类型,<typeName> 在此上下文中的类型查找不明确)

如何预处理具有多种类型缺失数据的数据集

如何编码具有多种数据类型的数据集?

具有多种数据类型的 Pyspark SQL 数据帧映射

查询具有多种记录类型的 CloudKit 数据库