如何在 UITableView 的 RXswift 和 RXCocoa 中实现 tableview 单元格的内部?

Posted

技术标签:

【中文标题】如何在 UITableView 的 RXswift 和 RXCocoa 中实现 tableview 单元格的内部?【英文标题】:How to implement in RXswift and RXCocoa of UITableView Inside of tableview cell? 【发布时间】:2018-08-21 14:13:17 【问题描述】:

我是 RXswift 新手,目前正在从事一个需要 rxswift 和 UITableView 位于 UITableViewCell 内的项目

以下是我到目前为止所做的一些代码,但每次向上/向下滚动时,它都不会显示正确的值

    var disposeBag = DisposeBag()

    viewModel.listExperience.asObservable().bind(to: tableView.rx.items(cellIdentifier: cellExperienceTableViewCell.getCellId(), cellType: ExperienceTableViewCell.self))
            row , data, cell in

             cell.lblTitle.text = data.title ?? ""
             cell.lblDate.text = data.startDate ?? ""
             cell.lblDetails.text = data.body ?? ""

            let filtered = self.viewModel.getDataCommentInRow(row) /* returns Variable<[Comments]> */
             cell.setCommentTableView(row: row, filtered: filtered)
             cell.tableViewOffset = self.storedOffsets[row] ?? 0
             cell.tableViewComments.reloadData()

           .disposed(by: disposeBag)

这是我的 tableView 单元格中 tableView 的代码

  func setCommentTableView(row : Int, filtered  : Variable<[ExperienceComment]>)

    tableViewComments.tag = row
    filtered.asObservable().bind(to: tableViewComments.rx.items(cellIdentifier: commentCell.getCellId(), cellType: CommentCell.self))  indexPath , data, cell in
        cell.lblComment.text = data.body
      .disposed(by: disposeBag)

有谁知道如何做到这一点?谢谢

【问题讨论】:

【参考方案1】:

我认为您唯一需要做的就是在表格视图单元格中添加一个prepareForReuse 方法。在其中添加disposeBag = DisposeBag()。确保您的 DisposeBag 是单元格内的 var 以便执行此操作。

如果我是对的,问题是当单元被重用时,它开始从多个filtered observables 中读取,因为它们都绑定到同一个 tableViewComments。

【讨论】:

谢谢,我忘了在这里添加 disposeBag 的声明,但我在该方法之外声明了一个 disposeBag(一个在我的 TableViewCell 内部,一个在我的 viewController 内部)。 “如果我是对的,问题是当单元格被重用时,它开始从多个过滤后的 observable 中读取,因为它们都绑定到同一个 tableViewComments。”是的,这正是我的 tableviewCell 发生的事情。我会检查“prepareForResue”,谢谢丹尼尔 是的,所以替换 prepareForReuse 中的 disposeBag 会导致它持有的当前绑定结束并为新绑定准备单元格。请记住,关闭 Observable 管道的方法是让生产者完成/出错,或者让消费者处理连接。 谢谢丹尼尔,我添加了我在 tableView 单元格中的 prepareForReuse 中添加了 disposeBag,现在一切正常。 :) 很高兴听到这个消息。请记住,您不是在 prepareForReuse 中“添加”处理袋。相反,您是在更换处置袋(从而删除旧的并处置其中的所有东西。)这就是为什么这样做。

以上是关于如何在 UITableView 的 RXswift 和 RXCocoa 中实现 tableview 单元格的内部?的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift、RxCocoa 和 UITableview

使用 RxSwift 在 UITableView 中进行 2 路绑定

使用 RxSwift 异步加载 UITableView 单元格

在 RxSwift 中测试 UITableView.rx.itemSelected 回调

无法使用 RxSwift 变量 asObservable() 设置绑定(到:UITableView)

RxSwift + RxRealm + RxCocoa 向 UITableView 插入行