5

我正在修改一点,UITableViewDiffableDataSource我能够毫无问题地加载一个 tableView。我正在尝试在 tableView 中创建节标题,但是我遇到了一些不稳定的行为。

节 enum enum 定义如下:

    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(我正在使用 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
    }
}
4

1 回答 1

7

我可以通过像这样子类化类来做到这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,而是使用子MyDataSource类。

于 2019-10-27T21:55:57.280 回答