1つのテーブルビュー内で複数のカスタムセルを使用できる場合のRxSwift
のコード例はありますか。たとえば、2つのセクションがあり、最初のセクションにはタイプCellWithImage
識別子のセルが10個あり、2番目のセクションにはタイプCellWithVideo
識別子のセルが10個あります。
私が見つけたすべてのtutとコード例は、たとえば RxSwiftTableViewExample のように、1つのセルタイプのみを使用しています。
助けてくれてありがとう
RxSwiftDataSources を使用して管理しました
複数のセクションを持つカスタムセルを使用できます。 このコードをヘルプに使用しました
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)
誰かが興味を持った場合のために、これが私の実装です。ゲームのリストを含むアプリがあります。ゲームが終了しているかどうかに応じて、異なるセルを使用します。これが私のコードです:
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
}
}