Создание заголовка раздела с помощью UITableViewDiffableDataSource

Я немного повозился с 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
    }

Это дает мне 4 метки, уложенные в ячейки заголовка в верхней части моего tableView.

Я запустил 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
    }
}

1 ответ

Я смог сделать это, создав подкласс 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 учебный класс.

Другие вопросы по тегам