Создание заголовка раздела с помощью 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
учебный класс.