差异快照重新加载节头

时间:2019-12-10 09:57:00

标签: ios swift iphone uitableview nsdiffabledatasourcesnapshot

使用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)
}

结果:

谢谢。

2 个答案:

答案 0 :(得分:2)

问题在于第一部分的标题没有改变。

此部分的类型为Date-NSDiffableDataSourceSnapshot<Date, Entry>(),并且星期和月份的开始日期都在同一天,即 2019年12月1日

就快照而言,星期和月份的日期仍然相同。

为了解决该问题,我创建了一个日期范围的对象:

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

然后将快照节类型从Date更改为DateRange

NSDiffableDataSourceSnapshot<DateRange, Entry>()

现在,如果开始日期相同且结束日期更改,则快照将知道他需要更新标题。

答案 1 :(得分:0)

这也可以:

var updatedSnapshot = dataSource.snapshot()
updatedSnapshot.reloadSections([.main])
self.dataSource.apply(updatedSnapshot, animatingDifferences: true)