Дифференцируемый источник данных - перезагрузить заголовок

Каким образом 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)
    }
}
Другие вопросы по тегам