RxSwift:对不同的细胞类型做出反应

时间:2018-12-10 15:04:32

标签: ios swift rx-swift

我在一个项目上使用RxSwift,其中我有一个DataSource和其他ViewItems。这就是我的DataSource配置:

let dataSource = RxTableViewSectionedReloadDataSource<SectionedViewItem>(configureCell: { _, tableView, indexPath, item in

            if let viewItem = item as? BannerViewItem {
                guard let cell = tableView.dequeueReusableCell(withIdentifier: BannerCell.Key, for: indexPath) as? BannerCell else { fatalError() }
                cell.configureBindings(itemSource: viewItem)
                return cell
            } else if let viewItem = item as? CarSpecificationViewItem {
                guard let cell = tableView.dequeueReusableCell(withIdentifier: CarSpecificationCell.Key, for: indexPath) as? CarSpecificationCell else { fatalError() }
                cell.configureBindings(itemSource: viewItem)
                return cell
            } else if let viewItem = item as? CarBenefitViewItem {
                guard let cell = tableView.dequeueReusableCell(withIdentifier: CarBenefitCell.Key, for: indexPath) as? CarBenefitCell else { fatalError() }
                cell.configureBindings(itemSource: viewItem)
                return cell
            } else if let viewItem = item as? FavoriteHeaderViewItem {
                guard let cell = tableView.dequeueReusableCell(withIdentifier: CarFavoritesCell.Key, for: indexPath) as? CarFavoritesCell else { fatalError() }
                cell.configureBindings(itemSource: viewItem)
                return cell
            } else {
                return UITableViewCell()
            }
        })

然后将其绑定到我的ViewModel

viewModel.dataSource.bind(to: tableView.rx.items(dataSource: dataSource)).disposed(by: disposeBag)

我通过以下方式订阅选择事件:

tableView.rx
    .modelSelected(CarSpecificationViewItem.self)
    .subscribe(tableViewRowSelected)
    .disposed(by: disposeBag)

只要我只对CarSpecificationViewItem做出反应,这种方法就可以正常工作。现在,我为userInteraction激活了CarFavoritesCell并也订阅了它的事件:

tableView.rx
    .modelSelected(FavoriteHeaderViewItem.self)
    .subscribe(test)
    .disposed(by: disposeBag)

但这开始产生错误。点击我的FavoriteHeaderViewItem时发生崩溃:

  

线程1:致命错误:无法从Optional(CLCarRentalCore.FavoriteHeaderViewItem)转换为CarSpecificationViewItem

问题的根源可能是什么?预先感谢!

2 个答案:

答案 0 :(得分:1)

我解决了上一层并选择ViewItemProtocol.self作为我选择的模型的问题,因为我所有的ViewItems都符合该协议。我仍然不明白为什么我提出的问题仍然无法解决...

tableView.rx
    .modelSelected(ViewItemProtocol.self)
    .subscribe(onNext: { [weak self] viewItem in
        switch viewItem {
        case let item as CarSpecificationViewItem:
            self?.carSpecificationSelected(for: item)
        case is FavoriteHeaderViewItem:
            self?.toggleLike()
        default:
            return
        }
    })
    .disposed(by: disposeBag)

答案 1 :(得分:0)

tableView.rx.modelSelected(Any.self)
                .subscribe(onNext: { [weak self] model in
                    guard let `self` = self  else { return }
                    switch model {
                        case is BannerViewItem:
                        let _model =  model as! BannerViewItem
                            // do your stuff
                            case is CarSpecificationViewItem
                            let _model =  model as! CarSpecificationViewItem 
                          // do your stuff
                          case is CarBenefitViewItem:
                          let _model =  model as! CarBenefitViewItem                       
                           // do your stuff
                           case is FavoriteHeaderViewItem:
                           let _model =  model as! FavoriteHeaderViewItem                       
                           // do your stuff
                           default: break

                           }
                       })
                .disposed(by: bag)