首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用UIButton disposeBag在UITableViewCell中防止重复的RxSwift水龙头

如何用UIButton disposeBag在UITableViewCell中防止重复的RxSwift水龙头
EN

Stack Overflow用户
提问于 2017-10-24 10:51:29
回答 2查看 3.2K关注 0票数 1

首先,不好意思标题混乱,但实际上我不能想出更好的(如果你做了,请编辑)。

我有一个使用协调员模式和RxSwift的应用程序,所以总的来说,我想把所有与导航相关的东西传递给协调员,这样它就可以处理导航逻辑了。

在一个视图控制器中,我有一个带有单元格的UITableView,该单元格中有UIButton。对于这种情况,我有一个:

代码语言:javascript
复制
actionButton.rx.tap.bind(to: viewModel.chapterAction).disposed(by: disposeBag)

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

代码语言:javascript
复制
var showChapter: Observable<Chapter> = self.chapterAction.mapTo(self.chapter)

我假设到目前为止,这段代码没有什么问题,所以在View的.bind(to: tableView.rx.items...中,我有:

代码语言:javascript
复制
viewModel.showChapter.bind(to: self.viewModel.chapterAction).disposed(by: viewModel.disposeBag)

因为我想将其绑定到查看控制器的viewModel,并在协调器中查看稍后的subscribe

一切正常,但是对于某些单元,我会得到复制的水龙头,为什么?我尝试过使用distinctUntilshareReply,但是似乎没有什么能帮助我解决问题,这不是一个确定性的问题。我怀疑有重复使用,但我不知道从哪里开始寻找这个问题.

EN

回答 2

Stack Overflow用户

发布于 2017-10-24 15:38:41

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

代码语言:javascript
复制
override func prepareForReuse() {
    super.prepareForReuse()
    disposeBag = DisposeBag()
}

然后,释放所有以前的订阅。

票数 3
EN

Stack Overflow用户

发布于 2017-11-06 08:49:24

我仍然不知道我的代码到底出了什么问题,但最后我在tableView.rx.items绑定块中直接添加了tableView.rx.items。现在看起来是这样的:

代码语言:javascript
复制
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中提到的,我想这是由于某些重用等原因,但我无法回答为什么会发生这种情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46908598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档