在RxSwift世界中使用UIButton的UITableViewCell

时间:2017-10-24 10:51:30

标签: ios swift uitableview rx-swift rx-cocoa

首先抱歉令人困惑的标题,但我实际上无法想出更好的东西(如果你这样做,请编辑)。

我有一个使用Coordinator模式和RxSwift的应用程序,所以总而言之,我想把所有导航相关的东西传递给Coordinator,这样它就可以处理导航逻辑了。
在一个视图控制器中,我UITableView的单元格内部有UIButton。对于那种情况,我有一个:

actionButton.rx.tap.bind(to: viewModel.chapterAction).disposed(by: disposeBag)

chapterAction是一个PublishSubject<Void>,因为它只反映按钮点按,但我需要将更多信息传递给协调员,所以稍后我将此chapterAction转换为:

var showChapter: Observable<Chapter> = self.chapterAction.mapTo(self.chapter)

假设到目前为止这个代码没有任何问题,所以在View Controller的.bind(to: tableView.rx.items...我有:

viewModel.showChapter.bind(to: self.viewModel.chapterAction).disposed(by: viewModel.disposeBag)

因为我想将它绑定到协调器中的视图控制器的viewModel和更晚的subscribe
一切正常,但对于某些细胞,我得到重复点击,为什么?我已经尝试过distinctUntilshareReply,但似乎没有什么可以帮助我解决问题,而且这不是一个确定性的问题。我怀疑有些人重复参与,但我不知道从哪里开始寻找这个问题......

2 个答案:

答案 0 :(得分:1)

您需要在disposeBag方法中重新初始化prepareForReuse()

override func prepareForReuse() {
    super.prepareForReuse()
    disposeBag = DisposeBag()
}

然后,处理所有先前的订阅。

答案 1 :(得分:0)

我仍然不知道我的代码究竟出了什么问题,但我最终直接在mapTo绑定块中添加了tableView.rx.items。现在它看起来像这样:

viewModel.chapterCellViewModels
    .bind(to: tableView.rx.items(cellIdentifier: ChapterCell.nameOfClass, cellType: ChapterCell.self )) { (_, viewModel, cell) in
        cell.configureCell(with: viewModel)

        cell.actionButton.rx.tap
            .mapTo(viewModel.chapter)
            .bind(to: self.viewModel.chapterAction)
            .disposed(by: cell.disposeBag)
    }
    .disposed(by: disposeBag)

正如我在OP中提到的 - 我想这是由于一些重用等原因,但我无法回答为什么会发生这种情况。