使用可区分数据源时如何处理空状态 - UICollectionViewDiffableDataSource?

How to handle empty state when using diffable data source - UICollectionViewDiffableDataSource?

在使用传统的UICollectionView时,我们经常使用如下代码来处理空状态:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    if items.count == 0 {
       // Display empty view
    } else {
      // Display collection view
    }
    return items.count
}

在 UICollectionView 或 UITableView 中使用可区分数据源时如何处理状态?

当你是 creating/updating 快照时你可以处理它:

func performQuery(animate: Bool) {
    var currentSnapshot = NSDiffableDataSourceSnapshot<Section, ViewCell>()
    
    if items.isEmpty {
        currentSnapshot.appendSections([Section(name: "empty")])
        currentSnapshot.appendItems([ViewCell(tag: 0, type: .empty)], toSection: Section(name: "empty"))
    } else {
        currentSnapshot.appendSections([Section(name: "items")])
        currentSnapshot.appendItems([ViewCell(tag: 1, type: .item)], toSection: Section(name: "items"))
    }
        
    dataSource.apply(currentSnapshot, animatingDifferences: animate)
}

使用上面的代码,CollectionView 将在项目为空时显示“空”单元格,否则显示正常的“项目”单元格。如果您不需要显示“空”视图,您可以在项目不为空时附加“项目”部分

如果你只想在有项目时显示集合视图(否则隐藏它),你可以这样做:

if items.isEmpty {
    collectionView.isHidden = true
    emptyView.isHidden = false
} else {
    collectionView.isHidden = false
    performQuery(animate: false)
    emptyView.isHidden = true
}