【发布时间】:2019-01-02 13:21:43
【问题描述】:
我有一个带有 RxDataSources 的表格视图,其中单元格项目有一个删除图标。当单元格出列并单击该删除图标时,将触发所有先前的单击事件,从而重复点击。 项目单元格:
removeImageView.rx.tap().map { _ in indexPath }
.bind(to: viewModel.onRemoveItem).disposed(by: cellDisposeBag)
单元格视图模型:
let onRemoveItem = PublishSubject<IndexPath>()
单元格和 ViewModel 绑定的视图控制器视图模型:
let vm = ItemViewModel(with: item)
vm.onRemoveItem.bind(to: self.onRemoveItem).disposed(by: self.rx.disposeBag)
return SectionItem.item(viewModel: vm)
视图控制器:
let dataSource = RxTableViewSectionedReloadDataSource<SectionItem>(configureCell: { dataSource, tableView, indexPath, item in
switch item {
case .item(let viewModel):
let cell = (tableView.dequeueReusableCell(withIdentifier: itemtIdentifier, for: indexPath) as? ItemCell)!
cell.bind(to: viewModel, at: indexPath)
return cell
}
}, titleForHeaderInSection: { dataSource, index in
let section = dataSource[index]
return section.title
} )
output?.items
.bind(to: tableView.rx.items(dataSource: dataSource))
.disposed(by: rx.disposeBag)
output?.onRemoveCartIemTapped.distinctUntilChanged()
.skip(1)
.distinctUntilChanged().drive(onNext: { [weak self] (indexPath) in
print("onRemoveCartIemTapped" + String(indexPath.item))
}).disposed(by: rx.disposeBag)
控制台调试:
onRemoveCartIemTapped0
onRemoveCartIemTapped3
onRemoveCartIemTapped1
onRemoveCartIemTapped4
【问题讨论】:
-
你有一个示例项目吗?我想帮你解决这个问题。这应该很容易,但我通常在 ViewModel 中使用 tableView 的委托和数据源方法的正常实现,而不使用 RxSwift 的扩展(但在整个项目中使用 RxSwift,而不仅仅是在 tableViews 中)。
-
您是否在单元格的
prepareForReuse方法中处理cellDisposeBag?如果在没有处理订阅的情况下重复使用单元格,则可能会导致这种行为。 -
不,我根本不使用 prepareForReuse。即使在点击按钮时我有单元格处理,我该怎么做
-
@Paul 我修好了,谢谢 :)。发表您的评论作为答案。
标签: ios swift uitableview rx-swift rxdatasources