在 RxSwift DataSource 中绑定多个数据和单元格
Binding multiple data and cells in RxSwiftDataSource
我试图在同一个 tableView 中显示多个单元格及其自己的数据模型。我为此添加了段控制,我删除了所有 tableview 当前数据并删除了当前数据源并绑定新数据及其单元格。但我收到以下错误消息 :( 如果您有任何报价,请帮助我 :(
P.s:每个段的单元格和部分设计彼此不同。
错误:线程 1:“尝试插入第 0 节,但更新后只有 0 个节”
enter image description here
在 ViewModel 文件中:
private func bindSelectedSegmentIndex() {
/// reset pagination and limit for new request
selectedSegmentIndex
.observe(on: MainScheduler.instance)
.do(onNext: { _ in
/// remove all old api data in tableviews
self.transactionsAndDepositsTableViewData.accept([])
self.contractsTableViewData.accept([])
self.pagination = Pagination()
self.updateTableViewDataSource.accept(())
})
.subscribe(onNext: { [weak self] _ in
guard let self = self else {return}
switch self.selectedSegmentIndex.value {
case 0,1:
self.callUserTransactionsAndDeposits()
case 2:
self.getContracts()
default:
return
}
})
.disposed(by: disposeBag)
}
在ViewController中:
@IBAction func segmentControlChanged(_ sender: UISegmentedControl) {
self.hapticImpactMedium()
let selectedIndex = sender.selectedSegmentIndex
self.viewModel.selectedSegmentIndex.accept(selectedIndex)
}
fileprivate func setupTransactionsAndDepositsDataSource() {
transactionsTableViewDataSource = TableViewSectionedAnimatedDataSourceWithRx(cell: WithdrawAndDepositCell.self,
data: WithdrawAndDepositSection.self)
transactionsTableViewDataSource?.handleCell = { cell ,item in
cell.item = item
}
transactionsTableViewDataSource?.dataSource.titleForHeaderInSection = { dataSource, index in
return dataSource.sectionModels[index].header
}
}
fileprivate func setupContractsDataSource() {
contractsTableViewDataSource = TableViewSectionedAnimatedDataSourceWithRx(cell: ContractTableViewCell.self,
data: ContractTableSection.self)
contractsTableViewDataSource?.handleCell = { cell ,item in
cell.item = item
}
contractsTableViewDataSource?.dataSource.titleForHeaderInSection = { dataSource, index in
return dataSource.sectionModels[index].header
}
}
private func setDataSources(with index: Int) {
/// remove old dataSource and update new one
tableView.dataSource = nil
tableView.delegate = nil
switch index {
case 0,1 :
setupTransactionsAndDepositsDataSource()
/// Bind tableViewData to the tableView items for transactionsTableViewDataSource
viewModel.transactionsAndDepositsTableViewData.asDriver()
.drive(tableView.rx.items(dataSource: transactionsTableViewDataSource.dataSource))
.disposed(by: disposeBag)
case 2:
setupContractsDataSource()
/// Bind tableViewData to the tableView items for clientsTableViewDataSource
viewModel.contractsTableViewData.asDriver()
.drive(tableView.rx.items(dataSource: contractsTableViewDataSource.dataSource))
.disposed(by: disposeBag)
default : break
}
}
I added segment control for this and I delete all tableview current data and removed the current data sources and binding new data and its cell.
不要那样做。您应该只绑定到提供数据源的单个 Observable。编写该数据源,以便它可以处理任何一种视图模型...
考虑一个枚举:
enum Section {
case withdrawAndDeposit(WidthdrawAndDepositSection)
case contractTable(ContractTableSection)
}
您发布的代码片段还有很多其他问题,需要更多关于如何使用 Rx 的教程,而不是 SO 答案所能容纳的。我建议您订阅 RxSwift Slack 并了解有关如何使用该系统的更多信息。
问题示例:
- 在视图模型中过度使用中继。
- 视图模型中的 DisposeBag。
- 在视图控制器中混合使用 UIControl (@IBAction) 和 Rx。
- 在 class 中不必要地保留对象。
我试图在同一个 tableView 中显示多个单元格及其自己的数据模型。我为此添加了段控制,我删除了所有 tableview 当前数据并删除了当前数据源并绑定新数据及其单元格。但我收到以下错误消息 :( 如果您有任何报价,请帮助我 :(
P.s:每个段的单元格和部分设计彼此不同。
错误:线程 1:“尝试插入第 0 节,但更新后只有 0 个节”
enter image description here
在 ViewModel 文件中:
private func bindSelectedSegmentIndex() {
/// reset pagination and limit for new request
selectedSegmentIndex
.observe(on: MainScheduler.instance)
.do(onNext: { _ in
/// remove all old api data in tableviews
self.transactionsAndDepositsTableViewData.accept([])
self.contractsTableViewData.accept([])
self.pagination = Pagination()
self.updateTableViewDataSource.accept(())
})
.subscribe(onNext: { [weak self] _ in
guard let self = self else {return}
switch self.selectedSegmentIndex.value {
case 0,1:
self.callUserTransactionsAndDeposits()
case 2:
self.getContracts()
default:
return
}
})
.disposed(by: disposeBag)
}
在ViewController中:
@IBAction func segmentControlChanged(_ sender: UISegmentedControl) {
self.hapticImpactMedium()
let selectedIndex = sender.selectedSegmentIndex
self.viewModel.selectedSegmentIndex.accept(selectedIndex)
}
fileprivate func setupTransactionsAndDepositsDataSource() {
transactionsTableViewDataSource = TableViewSectionedAnimatedDataSourceWithRx(cell: WithdrawAndDepositCell.self,
data: WithdrawAndDepositSection.self)
transactionsTableViewDataSource?.handleCell = { cell ,item in
cell.item = item
}
transactionsTableViewDataSource?.dataSource.titleForHeaderInSection = { dataSource, index in
return dataSource.sectionModels[index].header
}
}
fileprivate func setupContractsDataSource() {
contractsTableViewDataSource = TableViewSectionedAnimatedDataSourceWithRx(cell: ContractTableViewCell.self,
data: ContractTableSection.self)
contractsTableViewDataSource?.handleCell = { cell ,item in
cell.item = item
}
contractsTableViewDataSource?.dataSource.titleForHeaderInSection = { dataSource, index in
return dataSource.sectionModels[index].header
}
}
private func setDataSources(with index: Int) {
/// remove old dataSource and update new one
tableView.dataSource = nil
tableView.delegate = nil
switch index {
case 0,1 :
setupTransactionsAndDepositsDataSource()
/// Bind tableViewData to the tableView items for transactionsTableViewDataSource
viewModel.transactionsAndDepositsTableViewData.asDriver()
.drive(tableView.rx.items(dataSource: transactionsTableViewDataSource.dataSource))
.disposed(by: disposeBag)
case 2:
setupContractsDataSource()
/// Bind tableViewData to the tableView items for clientsTableViewDataSource
viewModel.contractsTableViewData.asDriver()
.drive(tableView.rx.items(dataSource: contractsTableViewDataSource.dataSource))
.disposed(by: disposeBag)
default : break
}
}
I added segment control for this and I delete all tableview current data and removed the current data sources and binding new data and its cell.
不要那样做。您应该只绑定到提供数据源的单个 Observable。编写该数据源,以便它可以处理任何一种视图模型...
考虑一个枚举:
enum Section {
case withdrawAndDeposit(WidthdrawAndDepositSection)
case contractTable(ContractTableSection)
}
您发布的代码片段还有很多其他问题,需要更多关于如何使用 Rx 的教程,而不是 SO 答案所能容纳的。我建议您订阅 RxSwift Slack 并了解有关如何使用该系统的更多信息。
问题示例:
- 在视图模型中过度使用中继。
- 视图模型中的 DisposeBag。
- 在视图控制器中混合使用 UIControl (@IBAction) 和 Rx。
- 在 class 中不必要地保留对象。