我在一个项目上使用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
问题的根源可能是什么?预先感谢!
答案 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)