如何在RxSwift中获取点击的按钮

7

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

我有一组按钮,如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个回答

4

只需将触摸事件映射到一些自定义ID即可 -


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

这里是按钮标签。

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)
}

3

您正在使用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)

如果操作不同,则: 示例 假设我有一个UIView和4个按钮。在按钮点击时,您更改视图的背景。每个按钮的颜色不同。因此,相同的功能但不同的颜色。
Observable.of(UIButton().rx.tap.map { _ in UIColor.red }).merge().subscribe(onNext: { color in
       UIView().backgroundColor = color
   })

1
//请编写一个函数,该函数将接受两个整数作为参数并返回它们的和。 - Kuldeep
@tspentzas,你能否提供另一种方法来代替使用merge()函数? - Ravi Dhorajiya
这是一个很好的答案,但你设置的方式需要大量的样板文件。更好的方法是将颜色数组与按钮数组一起“zip”起来,然后像我在我的答案中所做的那样将它们组合起来。结果将是更短的代码,更容易理解和更改(添加和删除按钮将会更加轻松)。无论如何,我会给你的答案点赞,但我希望看到你通过融入我的答案来升级它。 - Daniel T.

3

正确的做法是一开始就不要合并按钮。如果您想要执行四个不同的操作,则应该有四个不同的可观察对象。如果它们都执行相同的操作,只是使用不同的数据,则可以简单地:

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)

经过审核,我非常喜欢被删除的@Sooraj_snr所提供的答案。使用按钮标签而不是它们在数组中的位置。这样更加健壮。

let tags = buttons
    .map { ($0.rx.tap, $0.tag) }
    .map { obs, tag in obs.map { tag } }
let values = Observable.merge(tags)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接