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



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测试版开始,这将触发reloadData。不会有任何困难。

我发现在iOS 15之前使用reloadSections是可行的。

private func applyNewSnapshot() {
var newSnapshot = self.dataSource.snapshot()
if #available(iOS 15.0, *) {
self.dataSource.applySnapshotUsingReloadData(newSnapshot)
} else {
// Fallback on earlier versions
newSnapshot.reloadSections([.main])
self.dataSource.apply(newSnapshot, animatingDifferences: false)
}
}

最新更新