Ответ 1
Мне удалось это с помощью RxSwiftDataSources,
это позволяет вам использовать пользовательские ячейки с несколькими разделами. Я использовал этот код для помощи
Интересно, есть ли какой-либо пример кода для RxSwift
, когда я могу использовать несколько настраиваемых ячеек внутри одного вида таблицы. Так, например, у меня есть два раздела, а первая секция имеет 10 ячеек с идентификатором типа CellWithImage
, а вторая секция имеет 10 ячеек с идентификатором типа CellWithVideo
.
Все примеры и примеры кода, которые я основал, используют только один тип ячейки, например RxSwiftTableViewExample
Спасибо за любую помощь
Мне удалось это с помощью RxSwiftDataSources,
это позволяет вам использовать пользовательские ячейки с несколькими разделами. Я использовал этот код для помощи
В случае, если кто-то заинтересован, вот моя реализация. У меня есть приложение со списком игр. В зависимости от того, закончена или продолжается игра, я использую разные ячейки. Здесь мой код:
В ViewModel у меня есть список игр, они разбиваются на готовые/текущие и сопоставляют их с SectionModel
let gameSections = PublishSubject<[SectionModel<String, Game>]>()
let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String, Game>>()
...
self.games.asObservable().map {[weak self] (games: [Game]) -> [SectionModel<String, Game>] in
guard let safeSelf = self else {return []}
safeSelf.ongoingGames = games.filter({$0.status != .finished})
safeSelf.finishedGames = games.filter({$0.status == .finished})
return [SectionModel(model: "Ongoing", items: safeSelf.ongoingGames), SectionModel(model: "Finished", items: safeSelf.finishedGames)]
}.bindTo(gameSections).addDisposableTo(bag)
Затем в ViewController я привязываю свои разделы к моему представлению таблицы и использую разные ячейки, подобные этому. Обратите внимание, что я мог бы использовать indexPath для получения правильной ячейки вместо статуса.
vm.gameSections.asObservable().bindTo(tableView.rx.items(dataSource: vm.dataSource)).addDisposableTo(bag)
vm.dataSource.configureCell = {[weak self] (ds, tv, ip, item) -> UITableViewCell in
if item.status == .finished {
let cell = tv.dequeueReusableCell(withIdentifier: "FinishedGameCell", for: ip) as! FinishedGameCell
cell.nameLabel.text = item.opponent.shortName
return cell
} else {
let cell = tv.dequeueReusableCell(withIdentifier: "OnGoingGameCell", for: ip) as! OnGoingGameCell
cell.titleLabel.text = item.opponent.shortName
return cell
}
}
Вы можете установить несколько пользовательских ячеек без RxDatasource.
//Register Cells as you want
tableView.register(CustomRxTableViewCell.self, forCellReuseIdentifier: "Cell")
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "BasicCell")
ViewModel.data.bind(to: tableView.rx.items){(tv, row, item) -> UITableViewCell in
if row == 0 {
let cell = tv.dequeueReusableCell(withIdentifier: "BasicCell", for: IndexPath.init(row: row, section: 0))
cell.textLabel?.text = item.birthday
return cell
}else{
let cell = tv.dequeueReusableCell(withIdentifier: "Cell", for: IndexPath.init(row: row, section: 0)) as! CustomRxTableViewCell
cell.titleLb.text = item.name
return cell
}
}.disposed(by: disposeBag)