使用 UITableViewDiffableDataSource 创建部分标题

Adr*_*ian 4 diff uitableview ios swift diffabledatasource

我正在修修补补,UITableViewDiffableDataSource并且能够毫无问题地加载 tableView。我正在尝试在 tableView 中创建节标题,但是我遇到了一些奇怪的行为。

节 enum enum 定义如下:

    enum AlertLevel: String, Codable, CaseIterable {
        case green = "green"
        case yellow = "yellow"
        case orange = "orange"
        case red = "red"
    }
Run Code Online (Sandbox Code Playgroud)

这是我的实现 tableView(viewForHeaderInSection:)

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let label = UILabel()
        label.text = dataSource.snapshot().sectionIdentifiers[section].rawValue.capitalized
        label.textColor = UIColor.black

        return label
    }
Run Code Online (Sandbox Code Playgroud)

这给了我 4 个标签堆叠在我的 tableView 顶部的标题单元格中。

我启动了 Dash 到 RTFD,我看到了tableView(titleForHeaderInSection:)另一种剥猫皮的方法。所以我把这个扔进去,而不是:

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return dataSource.snapshot().sectionIdentifiers[section].rawValue.capitalized
    }
Run Code Online (Sandbox Code Playgroud)

我扔了一个断点,它永远不会被击中。所以我实现tableView(heightForHeaderInSection:)了标题得到更新,但没有显示标题的字符串。

该表的加载速度比“老式方式”快很多IndexPaths(我正在使用 USGS 地震数据库来学习TableViewDiffableDataSource),但我无法显示标题。

任何人都知道如何让部分工作在TableViewDiffableDataSource? 我很难相信他们会在没有这种基本功能的情况下将这样的东西放任自流,所以我只能得出结论,我弄脏了一些东西……什么,我不知道 :)

哦...这是我如何定义我的数据源:

func makeDataSource() -> UITableViewDiffableDataSource<AlertLevel, Earthquake> {
    return UITableViewDiffableDataSource(tableView: tableView) { tableView, indexPath, earthquake in
        let cell = tableView.dequeueReusableCell(withIdentifier: self.reuseID, for: indexPath)
        cell.textLabel?.text = earthquake.properties.title
        cell.detailTextLabel?.text = earthquake.properties.detail

        return cell
    }
}
Run Code Online (Sandbox Code Playgroud)

Tun*_*Fam 5

我能够通过UITableViewDiffableDataSource像这样子类化这个类来做到这一点:

class MyDataSource: UITableViewDiffableDataSource<Section, Int> {

    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        let section = self.snapshot().sectionIdentifiers[section]
        return section.header
    }
}

Run Code Online (Sandbox Code Playgroud)

你在哪里Section

enum Section: Int {
    case one

    var header: String {
        switch self {
        case .one: return "Header One"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后以这种方式分配新创建的数据源:

dataSource = MyDataSource<Section, Int>
Run Code Online (Sandbox Code Playgroud)

意思是,您不再需要使用UITableViewDiffableDataSource,而是使用子MyDataSource类。