将 3 个按钮的点击事件与 rxSwift 相结合

Posted

技术标签:

【中文标题】将 3 个按钮的点击事件与 rxSwift 相结合【英文标题】:combining tap event of 3 buttons with rxSwift 【发布时间】:2019-09-16 06:31:06 【问题描述】:

我有 3 个按钮

@IBOutlet weak var editGeomButton: UIButton! // 1
@IBOutlet weak var editDataButton: UIButton! // 2
@IBOutlet weak var deleteDataButton: UIButton! // 3

点击任何按钮时,我希望调用下面的方法。使用正确的数字。

func didTap() -> Observable<Int> 



didTap().subscribe(onNext:  (tag) in
    switch tag 
    case 1:
        print("Did tap Edit Geom")
    case 2:
        print("Did tap Edit Data")
    case 3:
        print("Did tap Delete geom")
    default:
        print("Invalid tap")
    
).disposed(by: disposeBag)

请帮助编写使用 Observable 的 didTap 方法的代码?我认为这可以使用组合运算符来实现。但我不明白如何编码。

【问题讨论】:

【参考方案1】:

我会使用枚举来避免默认情况:

enum Actions 
  case editGeom
  case editData
  case deleteGeom


Observable.merge(
  editGeomButton.rx.tap.map  _ in Actions.editGeom ,
  editDataButton.rx.tap.map  _ in Actions.editData ,
  deleteDataButton.rx.tap.map  _ in Actions.deleteGeom 
).subscribe(onNext: 
  switch $0 
  case .editGeom:
    print("Did tap Edit Geom")
  case .editData:
    print("Did tap Edit Data")
  case .deleteGeom:
    print("Did tap Delete geom")
  
).disposed(by: disposeBag)

基本上,它只是将每个点击映射到一个值,然后再将它们合并在一起。

【讨论】:

使用 Action 类型的绝佳模式,感觉就像 Redux。

以上是关于将 3 个按钮的点击事件与 rxSwift 相结合的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift之订阅UITableViewCell里的按钮点击事件

Rxswift 在事件发生时取消观察者并重新订阅

如何在 RxSwift 中过滤带有按钮标题的按钮点击?

将ZMQ事件循环与QT / Pyforms事件循环相结合

RxSwift:如何通过多个视图模型传递控制事件

RxSwift之UI控件UIButton与UIBarButtonItem扩展的使用