问题描述
如何重新加载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
。不会进行任何区分。