【问题标题】:Diffable Snapshot reload section headerDiffable Snapshot 重新加载节标题
【发布时间】:2020-04-03 11:31:41
【问题描述】:

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

结果:

提前致谢。

【问题讨论】:

    标签: ios swift iphone uitableview nsdiffabledatasourcesnapshot


    【解决方案1】:

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

    该部分的类型为 Date - NSDiffableDataSourceSnapshot&lt;Date, Entry&gt;(),并且周和月的开始日期都在同一天,即 2019 年 12 月 1 日

    所以就快照而言,日期仍然是相同的,无论是星期还是月份。

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

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

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

    NSDiffableDataSourceSnapshot&lt;DateRange, Entry&gt;()

    现在,如果开始日期相同,结束日期发生变化,快照就会知道他需要更新标头。

    【讨论】:

      【解决方案2】:

      这也有效:

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

      【讨论】:

        猜你喜欢
        • 2020-12-26
        • 2021-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        相关资源
        最近更新 更多