1

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 可以用于散列,因此当我更改属性时,表会重新加载,但感觉标题也应该重新加载,但它是单独处理的吗?

4

1 回答 1

1

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

于 2020-09-08T08:35:50.250 回答