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
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
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)
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
}
}