代码之家  ›  专栏  ›  技术社区  ›  Ravi Dhorajiya

如何获取在RxSwift中单击哪个按钮

  •  4
  • Ravi Dhorajiya  · 技术社区  · 6 年前

    我已经为我的按钮数组创建了一个公共操作。我只想知道哪个按钮被点击了。

    我有很多钮扣 let buttons = [UIButton(), UIButton(), UIButton(),UIButton()] .

    let observable = Observable.of(buttons[0].rx.tap, buttons[1].rx.tap, buttons[2].rx.tap, buttons[3].rx.tap).merge()
        observable.subscribe(onNext: {
          print("I want to find which button is tapped.")
        }).disposed(by: disposeBag)
    
    4 回复  |  直到 6 年前
        1
  •  2
  •   Daniel T.    6 年前

    正确的答案是首先不要合并按钮。如果你想做四件不同的事情,那么就有四个不同的可观察物。如果它们都在做相同的事情,只是使用不同的数据,那么只需:

    let taps = buttons.enumerated().map { ($0.0, $0.1.rx.tap) }
    let toInts = taps.map { index, obs in obs.map { index } }
    let mergedTaps = Observable.merge(toInts)
    

    let tags = buttons
        .map { ($0.rx.tap, $0.tag) }
        .map { obs, tag in obs.map { tag } }
    let values = Observable.merge(tags)
    
        2
  •  4
  •   Maxim Volgin    6 年前

    let observable = Observable.merge(
      buttons[0].rx.tap.map { 0 },
      buttons[1].rx.tap.map { 1 },
      // etc.
    )
    
    observable.subscribe(onNext: { id in
      print("\(id) button is tapped.")
    }).disposed(by: disposeBag)
    
        3
  •  3
  •   tspentzas    6 年前

    您正在使用merge()。你不知道哪个正在被窃听。

    如果你想要多个按钮,但只有一个动作,你做的是正确的。

    let observable = Observable.of(buttons[0].rx.tap, buttons[1].rx.tap, 
        buttons[2].rx.tap, buttons[3].rx.tap).merge()
        observable.subscribe(onNext: {
        print("I want to find which button is tapped.")
        }).disposed(by: disposeBag)
    

    如果动作不同,则:

    Observable.of(UIButton().rx.tap.map { _ in UIColor.red }).merge().subscribe(onNext: { color in
           UIView().backgroundColor = color
       })
    
        4
  •  3
  •   Ravi Dhorajiya    6 年前

    这里我们给出了按钮标签。

    buttons.enumerated().forEach { (index, button) in
      button.tag = index
    }
    

    这里是我们选择的按钮。

    for button in buttons {
      button.rx.tap.subscribe { [weak self] event in
        print("Selected Button :- \(button.tag)")
        }.disposed(by: disposeBag)
    }