web-dev-qa-db-fra.com

Vue de table RxSwift avec plusieurs types de cellules personnalisés

Je me demande s'il existe un exemple de code pour RxSwift lorsque je peux utiliser plusieurs cellules personnalisées dans une seule vue de table. Ainsi, par exemple, j'ai deux sections et la première section a 10 cellules avec l'identifiant de type CellWithImage et la deuxième section a 10 cellules avec l'identifiant de type CellWithVideo.

Tous les tuts et exemples de code que j'ai fondés n'utilisent qu'un seul type de cellule, par exemple RxSwiftTableViewExample

Merci pour toute aide

19
edzio27

Je l'ai géré en utilisant RxSwiftDataSources ,

il vous permet d'utiliser des cellules personnalisées avec plusieurs sections. J'ai utilisé ce code pour obtenir de l'aide

11
edzio27

Vous pouvez définir plusieurs cellules personnalisées sans 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)
7
Hanryang

Au cas où quelqu'un serait intéressé, voici mon implémentation. J'ai une application avec une liste de jeux. Selon que le jeu est terminé ou en cours, j'utilise différentes cellules. Voici mon code:

Dans le ViewModel, j'ai une liste de jeux, les divise en finis/en cours et les mappe sur 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)

Ensuite, dans le ViewController, je lie mes sections à ma vue de table et j'utilise différentes cellules comme celle-ci. Notez que je pourrais utiliser l'indexPath pour obtenir la bonne cellule au lieu du statut.

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
    }
}
4
streem