Заголовок раздела 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)