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

标签 ios swift uicollectionview

我正在使用 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)
我的问题是我无法弄清楚如何使用一组新项目重新加载集合 View 中的部分而不将它们附加到当前项目。 snapshot 可用的方法只允许将项目附加到该部分,但我需要替换该部分的项目。我尝试删除该部分,将其附加回来,然后附加新的项目集:
snapshot.deleteSections([.section1])
snapshot.appendSections([.section1])
snapshot.appendItems([myItems], toSection: .section1)
这只会删除该部分,但不会加载新项目。我正在寻找一种方法来简单地用新项目刷新该部分,类似于您调用 collectionView.reloadData() 的方式。使用普通 UICollectionViewDataSource 时。

最佳答案

直接修改快照

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

  • 这是作为 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 )命名表示数据源的结构。

    关于ios - 使用 UICollectionViewDiffableDataSource 时如何重新加载 UICollectionView 部分中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62995493/

    相关文章:

    objective-c - Controller 是否应该知道iOS应用程序中的NSManagedObjectContext

    ios - 非空数组,访问第一个元素 : index out of range (Swift 2. 0)

    swift - 如何在 SwiftUI 中将图像转换为 Base64?

    ios - 如何显示UICollectionViewCell的MenuController?

    ios - UICollectionView + SDWebImage + 单元格重用

    ios - SpriteKit - 停止物体弹跳

    android - 如何在 Android 和 iOS 中限制我的付费应用程序只能用于同一帐户中的一台设备

    javascript - 如何删除配置文件中的状态栏

    swift - UICollectionView 不更新

    ios - 如何在 UICollectionViewDataSource 和 UICollectionViewDelegateFlowLayout 方法中调用正确的数据源?