Табличное представление RxSwift с несколькими пользовательскими типами ячеек

Интересно, есть ли какой-нибудь пример кода для RxSwift, когда я могу использовать несколько пользовательских ячеек внутри одного табличного представления. Так, например, у меня есть два раздела, и первый раздел имеет 10 ячеек с идентификатором типа CellWithImage, а второй раздел имеет 10 ячеек с идентификатором типа CellWithVideo.

Все материалы и примеры кода, которые я создал, используют только один тип ячеек, например RxSwiftTableViewExample

Спасибо за любую помощь


person edzio27    schedule 22.08.2016    source источник


Ответы (3)


Вы можете установить несколько пользовательских ячеек без 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)
person Hanryang    schedule 27.05.2019

Я справился с этим с помощью RxSwiftDataSources,

это позволяет вам использовать пользовательские ячейки с несколькими разделами. Я использовал этот код для справки

person edzio27    schedule 24.08.2016
comment
Можете ли вы поделиться кодом, как вы это реализовали в конце концов? - person nburk; 22.11.2016
comment
это ? мы не можем добавить другую табличную функцию напрямую с RxSwift? - person Jatin Garg; 07.07.2021

Если кому интересно, вот моя реализация. У меня есть приложение со списком игр. В зависимости от того, закончена игра или все еще продолжается, я использую разные ячейки. Вот мой код:

В 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] (datasource, tableview, indexpath, item) -> UITableViewCell in
    if item.status == .finished {
        let cell = tableview.dequeueReusableCell(withIdentifier: "FinishedGameCell", for: indexpath) as! FinishedGameCell
        cell.nameLabel.text = item.opponent.shortName
        return cell
    } else {
        let cell = tableview.dequeueReusableCell(withIdentifier: "OnGoingGameCell", for: indexpath) as! OnGoingGameCell
        cell.titleLabel.text = item.opponent.shortName
        return cell
    }
}
person streem    schedule 09.01.2017
comment
Как можно обновить элемент в источнике данных? dataSource.sectionModels доступен только для чтения. Моя модель представляет собой массив, и я пытаюсь обновить один из элементов после некоторого пользовательского ввода. Спасибо - person MikeG; 02.10.2018