web-dev-qa-db-ja.com

複数のカスタムセルタイプを含むRxSwiftテーブルビュー

1つのテーブルビュー内で複数のカスタムセルを使用できる場合のRxSwiftのコード例はありますか。たとえば、2つのセクションがあり、最初のセクションにはタイプCellWithImage識別子のセルが10個あり、2番目のセクションにはタイプCellWithVideo識別子のセルが10個あります。

私が見つけたすべてのtutとコード例は、たとえば RxSwiftTableViewExample のように、1つのセルタイプのみを使用しています。

助けてくれてありがとう

19
edzio27

RxSwiftDataSources を使用して管理しました

複数のセクションを持つカスタムセルを使用できます。 このコードをヘルプに使用しました

11
edzio27

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

誰かが興味を持った場合のために、これが私の実装です。ゲームのリストを含むアプリがあります。ゲームが終了しているかどうかに応じて、異なるセルを使用します。これが私のコードです:

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