Как узнать, какая кнопка нажата в RxSwift - PullRequest
0 голосов
/ 11 октября 2018

Я создал общее действие для массива моей кнопки.Я просто хочу, чтобы какая кнопка была нажата.

У меня есть массив кнопок, таких как 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 ]

0 голосов
/ 22 октября 2018

Здесь мы даем тег кнопки.

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)
}
0 голосов
/ 11 октября 2018

Просто сопоставьте события касания с некоторыми пользовательскими идентификаторами -

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)
0 голосов
/ 11 октября 2018

Правильный ответ - не объединять кнопки в первую очередь.Если вы хотите сделать четыре разные вещи, то есть четыре разные наблюдаемые.Если они все делают одно и то же, просто с разными данными, то просто:

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)
0 голосов
/ 11 октября 2018

Вы используете 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
   })
...