【Swift】RxSwiftでボタンのタップイベントを拾う


RxSwiftはボタンのタップイベントとTableView CollecrionViewの実装が格段に楽になるので大好きです。
今回はボタンのタップイベントの実装をいくつかご紹介します。

subscribe(_ on:)を使う

subscribe(_ on:)の説明

Subscribes an event handler to an observable sequence.
- parameter on: Action to invoke for each event in the observable sequence.
- returns: Subscription object used to unsubscribe from the observable sequence.

つまり監視できるもののイベントを拾えるのです。
これを使ってButtonのタップイベントを拾うとこんな感じになります。

button.rx.tap.subscribe({ [weak self] _ in
    // ボタンタップでキックしたいアクションを記述
    }).disposed(by: disposeBag)

[weak self][unowned self]でももちろんOKですが、私は管理が面倒なので[weak self]を使うことが多いです。
循環参照一度起こすと結構調査が面倒だし、平気でクラッシュするから脳筋weakしちゃうんですよね。。

[weak self]と[unowned self]についてはこちらの記事が面白かったです

bind(to observers:)を使う

私は普段この実装方法を取り入れていることが多いです。

private func setButton() {
    button.rx.tap.bind(to: buttonTapBinder).disposed(by: disposeBag)
}

private var buttonTapBinder: Binder<()> {
    return Binder(self) { base, _  in
        base.button.isSelected = !base.button.isSelected
    }
}

Binderを使用しているので、循環参照は自ずと防がれるので結構使ってます。
subscribeの実装もそうですが、どちらもボタンのタップだけではなく、他のイベントの監視もできるのでぜひ応用してみてください!

RxSwiftに関する記事

【Swift】RxSwiftを使ったTableViewの実装(Delegate/reloadDataは使わない!)