如何在 RxSwift 中观察 UITableView 点击/选择的先前值和当前值?

Posted

技术标签:

【中文标题】如何在 RxSwift 中观察 UITableView 点击/选择的先前值和当前值?【英文标题】:How to observe previous and current value in RxSwift for UITableView tap/selection? 【发布时间】:2017-12-19 00:56:43 【问题描述】:

我的UIViewController 中有以下代码:

  _ = viewModel.selectedCountryId.asObservable()
       .distinctUntilChanged()
        .scan((0, 0), accumulator:  (prev, curr) in
            return zip(prev, curr)
        )
        .subscribe(onNext: 
            let prevCell = self.tableView.cellForRow(at: IndexPath(row: previous, section: 0))
            prevCell?.accessoryType = .none
            let currCell = self.tableView.cellForRow(at: IndexPath(row: curr, section: 0))
            currCell?.accessoryType = .checkmark
        ).disposed(by: disposeBag)`

我不知道在 scan 上做什么,我相信通过查看一些 SO 帖子可以解决这个问题。

我想要实现的是选择一行并取消选择上一行,以使tableview具有右侧带有复选标记图标的单选机制。

我使用 viewModel 中的Variable<Int>,因为我需要保存我选择的行,以便在进行一些操作后将其传递给另一个视图控制器。

如有不妥之处,请多多指教。我仍然是 MVVM e RxSwift 的初学者。

编辑

这是选择项目时的订阅:

_ = tableView.rx.itemSelected.subscribe(onNext: [weak self] indexPath in self?.viewModel.selectedCountryId.value = indexPath.row )

【问题讨论】:

【参考方案1】:

对于这个用例,我更喜欢 zip 而不是扫描。

Observable.zip(viewModel.selectedCountryId.asObservable(), viewModel.selectedCountryId.asObservable().skip(1)) 
  ($0, $1)
.subscribe(onNext:  [weak self] (previous, curr) in
  let prevCell = self.tableView.cellForRow(at: IndexPath(row: previous, section: 0))
  prevCell?.accessoryType = .none
  let currCell = self.tableView.cellForRow(at: IndexPath(row: curr, section: 0))
  currCell?.accessoryType = .checkmark
).disposed(by: disposeBag)

Zip 将为每个 observables 组合发射。与第二个一样,我们跳过一个值,我们将获得以前的和当前的。 您可能希望在订阅之前添加一个 startWith 运算符,以便在最初选择的单元格上添加复选标记。

绑定您的选择:

tableView.rx.itemSelected.map  $0.row .bind(to: self.viewModel.selectedCountryId).disposed(by: disposeBag)

【讨论】:

以上是关于如何在 RxSwift 中观察 UITableView 点击/选择的先前值和当前值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 RxSwift 中观察 UITableView 点击/选择的先前值和当前值?

如何使用 RxSwift 观察 Bool 属性?

在 RxCocoa/RxSwift 中,如何观察 BehaviorRelay<[object]> 数组大小发生变化

如何在 RxSwift 中将值附加到观察到的数组

RxSwift 可观察到的错误停止链 - 带有 Rx 的 Web 服务,如何恢复?

如何使用 RxSwift 观察 UITextField 中的文本变化?