RxSwift: реагирование на разные типы ячеек - PullRequest
0 голосов
/ 10 декабря 2018

Я использую 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: неустранимая ошибка: сбой преобразования из необязательного (CLCarRentalCore.FavoriteHeaderViewItem) в CarSpecificationViewItem

Что может быть источникомпроблемы?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018
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)
0 голосов
/ 10 декабря 2018

Я решил проблему, поднявшись на один уровень выше и выбрав 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)
...