使用 UICollectionViewDiffableDataSource 时如何重新加载 UICollectionView 中的部分数据?

Posted

技术标签:

【中文标题】使用 UICollectionViewDiffableDataSource 时如何重新加载 UICollectionView 中的部分数据?【英文标题】:How to reload data in section in UICollectionView when using UICollectionViewDiffableDataSource? 【发布时间】:2020-07-20 12:33:27 【问题描述】:

我使用UICollectionViewDiffableDataSource 作为我的collectionView 的数据源。我的 CollectionView 中有 3 个部分:

enum Section 
    case section1
    case section2
    case section3

最初,我使用以下代码将这 3 个部分附加到 collectionView:

var snapshot = self.diffableDataSource.snapshot()
snapshot.appendSections([.section1, .section2, .section3])
self.diffableDataSource.apply(snapshot)

然后我使用以下代码将项目附加到部分:

var snapshot = self.diffableDataSource.snapshot()
snapshot.appendItems([myItems], toSection: .section1)
self.diffableDataSource.apply(snapshot)

我的问题是我无法弄清楚如何在不将它们附加到当前项目的情况下使用一组新项目重新加载集合视图中的部分。 snapshot 可用的方法仅允许将项目附加到该部分,但我需要替换该部分的项目。我尝试删除该部分,将其附加回来,然后附加新的一组项目:

snapshot.deleteSections([.section1])
snapshot.appendSections([.section1])
snapshot.appendItems([myItems], toSection: .section1)

这只会删除该部分,但不会加载新项目。我正在寻找一种方法来简单地用新项目刷新该部分,类似于使用普通 UICollectionViewDataSource 时调用collectionView.reloadData() 的方式。

【问题讨论】:

【参考方案1】:

直接修改快照

确定该部分中的项目 删除项目 追加新项目 重新加载部分 应用快照

这是作为UICollectionViewDiffableDataSource扩展的通用方法

extension UICollectionViewDiffableDataSource 
    
    func replaceItems(_ items : [ItemIdentifierType], in section: SectionIdentifierType) 
        var currentSnapshot = snapshot()
        let itemsOfSection = currentSnapshot.itemIdentifiers(inSection: section)
        currentSnapshot.deleteItems(itemsOfSection)
        currentSnapshot.appendItems(items, toSection: section)
        currentSnapshot.reloadSections([section])
        apply(currentSnapshot, animatingDifferences: true)
    

请以大写字母开头并以单数形式 (MyItem) 命名表示数据源的结构。

【讨论】:

以上是关于使用 UICollectionViewDiffableDataSource 时如何重新加载 UICollectionView 中的部分数据?的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)