使用UITableViewDiffableDataSource创建节标题

时间:2019-10-26 06:04:53

标签: ios swift uitableview diff diffabledatasource

我对UITableViewDiffableDataSource进行了一些修改,并且可以使tableView顺利加载。我正在尝试在tableView中创建节标题,但是遇到了一些易燃的行为。

该部分枚举的枚举定义如下:

    enum AlertLevel: String, Codable, CaseIterable {
        case green = "green"
        case yellow = "yellow"
        case orange = "orange"
        case red = "red"
    }

这是我对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
    }

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

我将Dash发射到RTFD,然后发现tableView(titleForHeaderInSection:)是为那只猫换皮的另一种方法。所以我把它扔进去了,

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

我在其中插入了一个断点,但它从未被击中。因此,我实现了tableView(heightForHeaderInSection:),并且标头得到更新,但标头没有显示任何字符串。

IndexPaths相比,该表加载LOT的速度比“老式方式”快(我正在使用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
    }
}

1 个答案:

答案 0 :(得分:1)

我可以通过如下子类化data.shape类来做到这一点:

UITableViewDiffableDataSource

您的class MyDataSource: UITableViewDiffableDataSource<Section, Int> { override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { let section = self.snapshot().sectionIdentifiers[section] return section.header } } 在哪里:

Section

,然后通过以下方式分配您新创建的数据源:

enum Section: Int {
    case one

    var header: String {
        switch self {
        case .one: return "Header One"
        }
    }
}

意思是,您不再需要使用dataSource = MyDataSource<Section, Int> ,而是使用子类UITableViewDiffableDataSource的类。