在 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 中不必要地保留对象。