差异数据源-重新加载标头

问题描述

如何重新加载UICollectionViewDiffableDataSource标头?

我有一个集合视图,其标题显示用户详细信息,行显示帖子,模型是

struct PostUser {
    var user: User
    var post: Post
}

当我通过快照更改属性

    var postUsers = [PostUser]() {
        didSet {
            self.applySnapshot(postUsers)
        }
    }

    fileprivate func applySnapshot(_ postsUser: [PostUser]) {
        var snapshot = NSDiffableDataSourceSnapshot<Section,PostUser>()
        snapshot.appendSections([.main])
        snapshot.appendItems(postsUser)
        self.datasource.apply(snapshot,animatingDifferences: true)
    }

重新加载行,但是补充标头没有。我可以更改标题的唯一方法是使Section成为模型的一部分,所以:

    struct Section: Hashable {
        var User: User
    }

我的应用快照现在变为

    fileprivate func applySnapshot(_ postsUser: [PostUser]) {
        var snapshot = NSDiffableDataSourceSnapshot<Section,PostUser>()
        snapshot.appendSections([Section(User: self.user)])
        snapshot.appendItems(postsUser)
        self.datasource.apply(snapshot,animatingDifferences: true)
    }

然后我分别设置用户

    var user: User! = nil {
        didSet {
            self.applySnapshot(self.postUsers)
        }
    }

并重新加载标头。

我不太了解为什么在postUsers中进行某些更改时会重新加载行,但是标题却不会加载-直到我将模型实现为该部分的一部分为止?

我确实知道diffable可以在散列上工作,所以当我更改属性时,表会重新加载,但是感觉标题也应该重新加载,但是将其单独处理?

解决方法

仅在检测到节本身发生更改时才重新加载标头。如果仅更改项目,则补充视图将保持不变。根据情况的不同,您可能需要考虑的另一件事是,当您要重新加载标头时,将animatingDifferences设置为false,因为从最新的iOS 14 beta开始,它将触发reloadData 。不会进行任何区分。