Diffable 数据源 - 重新加载标头

mic*_*sox 4 ios swift diffabledatasource uicollectionviewdiffabledatasource

可以通过哪些方式UICollectionViewDiffableDataSource重新加载标头?

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

struct PostUser {
    var user: User
    var post: Post
}
Run Code Online (Sandbox Code Playgroud)

当我通过快照更改属性时

    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)
    }
Run Code Online (Sandbox Code Playgroud)

行会重新加载,但补充标题不会重新加载。我可以更改标题的唯一方法是使“部分”成为模型的一部分,因此:

    struct Section: Hashable {
        var User: User
    }
Run Code Online (Sandbox Code Playgroud)

我的应用快照现在变成

    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)
    }
Run Code Online (Sandbox Code Playgroud)

然后我单独设置用户

    var user: User! = nil {
        didSet {
            self.applySnapshot(self.postUsers)
        }
    }
Run Code Online (Sandbox Code Playgroud)

并且标题重新加载。

我不太明白为什么当我更改 postUsers 中的某些内容时,行会重新加载,但标题不会重新加载 - 直到我将模型实现为该部分的一部分?

我确实了解 diffable 适用于散列,因此当我更改属性时,表会重新加载,但感觉标头也应该重新加载,但它是单独处理的?

Lal*_*alo 5

仅当检测到该部分本身发生更改时才会重新加载标头。如果仅项目发生变化,补充意见将保持不变。根据您的情况,您可以考虑的另一件事是设置animatingDifferencesfalse当您想要重新加载标头时,因为从最新的 iOS 14 beta 开始,这将触发reloadData. 不会进行任何比较。

  • 在 iOS 15 上,此建议应改为调用 applySnapshotUsingReloadData (3认同)