Дифференцируемый источник данных - перезагрузить заголовок
Каким образом
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)
}
строки перезагружаются, а дополнительный заголовок - нет. Единственный способ изменить заголовок - это сделать секцию частью модели, поэтому:
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 работает с хешированием, поэтому, когда я изменяю свойство, таблица перезагружается, но кажется, что заголовок также должен перезагрузиться, но он обрабатывается отдельно?
2 ответа
Заголовки перезагружаются только при обнаружении изменения в самом разделе. Если изменяются только элементы, дополнительные виды останутся неизменными. Еще одна вещь, которую вы могли бы изучить в зависимости от вашего случая, - это установить
animatingDifferences
к
false
когда вы хотите перезагрузить заголовок, поскольку в последней бета-версии iOS 14 это вызовет
reloadData
. Никаких различий сделано не будет.
Я решил использоватьreloadSections
для iOS 15 предыдущая версия работоспособна.
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)
}
}