【问题标题】:Diffable Data Source - Reload HeaderDiffable 数据源 - 重新加载标题
【发布时间】:2020-12-26 14:38:25
【问题描述】:

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 对哈希有效,所以当我更改属性时,表会重新加载,但感觉标题也应该重新加载,但它是单独处理的?

【问题讨论】:

    标签: ios swift diffabledatasource uicollectionviewdiffabledatasource


    【解决方案1】:

    只有在检测到部分本身发生变化时才会重新加载标题。如果只有项目发生变化,补充视图将保持不变。根据您的情况,您可以考虑的另一件事是将animatingDifferences 设置为false,因为从最新的iOS 14 beta 开始,这将触发reloadData。不会进行差异化。

    【讨论】:

    • 在 iOS 15 上,这个建议应该改为调用 applySnapshotUsingReloadData
    • 是的,iOS 15 引入了许多关于重新加载和差异的改进,现在无论动画如何都会发生,所以如果你的目标是 iOS 15+,请绝对忽略我的回答
    猜你喜欢
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 2020-09-27
    相关资源
    最近更新 更多