Заголовок раздела Diffable Snapshot reload

При перезагрузке данных представления таблицы с помощью NSDiffableDataSourceSnapshot, в табличном представлении будут перезагружены только те разделы, которые содержат отличия от предыдущего снимка.

У меня есть табличное представление, содержащее записи с определенными датами. Записи упорядочены по разделам для входной недели / месяца / настраиваемого диапазона дат в зависимости от того, что пользователь выбрал в элементе управления сегментом.

Когда у меня есть недельный раздел, и эта неделя - единственная неделя, существующая в этом месяце, раздел не будет обновляться, когда пользователь выберет другой диапазон дат, и заголовок останется прежним.

Как я могу перезагрузить все заголовки разделов независимо от того, есть ли разница между этим и предыдущим снимком?

Вот код для настройки снимка:

struct EntriesSection {

    let date: Date
    var entries: [Entry] = []
}

var sections: [EntriesSection]()

private func setupSnapshot() {

    snapshot = NSDiffableDataSourceSnapshot<Date, Entry>()

    sections.forEach {
        snapshot.appendSections([$0.date])
        snapshot.appendItems($0.entries, toSection: $0.date)
    }

    dataSource?.apply(snapshot, animatingDifferences: true)
}

Полученные результаты:

Заранее спасибо.

1 ответ

Решение

Проблема была в названии первого раздела, которое не менялось.

Раздел имеет тип Date - NSDiffableDataSourceSnapshot<Date, Entry>()и как неделю и месяц дата начала был в тот же день, что 1 декабря 2019.

Что касается снимка, дата остается той же, как для недели, так и для месяца.

Чтобы решить эту проблему, я создал объект, который представляет собой диапазон дат:

struct DateRange: Hashable {
  let from: Date
  let to: Date
}

А затем изменил тип раздела снимка с Date к DateRange:

NSDiffableDataSourceSnapshot<DateRange, Entry>()

Теперь, если дата начала такая же, а дата окончания изменится, снимок будет знать, что ему нужно обновить заголовок.

Это также работает:

var updatedSnapshot = dataSource.snapshot()
updatedSnapshot.reloadSections([.main])
self.dataSource.apply(updatedSnapshot, animatingDifferences: true)
Другие вопросы по тегам