#ios #swift #uitableview #uikit #rx-swift
Вопрос:
Я пытаюсь реализовать TableView с помощью RxTableViewSectionedAnimatedDataSource, я правильно настроил все подклассы, когда я пытаюсь привязать источник данных к моему TableView, компилятор постоянно предупреждает меня
Метод экземпляра «элементы(источник данных:)» требует, чтобы «TableViewSectionedDataSource» соответствовал «RxTableViewDataSourceType»
Вот код
let tableView = UITableView() let dataSource = RxTableViewSectionedAnimatedDataSourcelt;CustomSectionDataTypegt;(configureCell: { dataSource, tableView, indexPath, item in return UITableViewCell() }) dataSource.titleForHeaderInSection = { (ds, section) in let sectionModel = ds.sectionModels[section] return sectionModel.header } let sectionDatas = [CustomSectionDataType(ID: "1", header: "test", items: ["WTF!"])] let items = BehaviorRelay(value: [sectionDatas]) items .bind(to: tableView.rx.items(dataSource: dataSource)) .disposed(by: self.disposeBag)
Пользовательский Класс Раздела
struct CustomSectionDataType { var ID: String var header: String var items: [Item] } extension CustomSectionDataType: AnimatableSectionModelType { typealias Item = String typealias Identity = String var identity: String { return ID } init(original: CustomSectionDataType, items: [Item]) { self = original self.items = items } }
Ответ №1:
У вас слишком глубоко вложенный массив для вашего items
типа.
Тип определяется так BehaviorRelaylt;[[CustomSectionDataType]]gt;
, как это должно быть BehaviorRelaylt;[CustomSectionDataType]gt;
.
Кроме того, рассмотрите возможность использования typealias вместо создания собственного пользовательского типа:
typealias CustomSectionDataType = AnimatableSectionModellt;String, Stringgt;
или если у вас есть два одинаковых заголовка, но с разными идентификаторами, то:
struct CustomModel: IdentifiableType { var identity: String var header: String } typealias CustomSectionDataType = AnimatableSectionModellt;CustomModel, Stringgt;
Это немного облегчает жизнь.