Moh*_*ANE 2 uitableview ios swift rx-swift rxdatasources
我有一个带有 RxDataSources 的表格视图,其中单元格项目有一个删除图标。当单元格出队并单击该删除图标时,所有先前的单击事件都会被触发,从而重复点击。项目单元格:
removeImageView.rx.tap().map { _ in indexPath }
.bind(to: viewModel.onRemoveItem).disposed(by: cellDisposeBag)
Run Code Online (Sandbox Code Playgroud)
单元格视图模型:
let onRemoveItem = PublishSubject<IndexPath>()
Run Code Online (Sandbox Code Playgroud)
单元格和 ViewModel 绑定的视图控制器视图模型:
let vm = ItemViewModel(with: item)
vm.onRemoveItem.bind(to: self.onRemoveItem).disposed(by: self.rx.disposeBag)
return SectionItem.item(viewModel: vm)
Run Code Online (Sandbox Code Playgroud)
视图控制器:
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)
Run Code Online (Sandbox Code Playgroud)
控制台调试:
onRemoveCartIemTapped0
onRemoveCartIemTapped3
onRemoveCartIemTapped1
onRemoveCartIemTapped4
Run Code Online (Sandbox Code Playgroud)
这是由于UITableView重复使用电池造成的。为了避免有多个订阅,您可以重写单元格的prepareForReuse()方法并确保释放任何现有的订阅。
我通常将 声明DisposeBag为 var,然后DisposeBag在 中为其分配一个新值prepareForReuse()。当DisposeBag被定义时,它将处理它包含的所有订阅。就像是:
override func prepareForReuse() {
super.prepareForReuse()
cellDisposeBag = DisposeBag()
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1594 次 |
| 最近记录: |