RxSwiftを使ってUIKitのRXデータバインディングを実装する
概要
今回はRxSwiftを使ってUIKitのデータバインディングの実装を見ていきます。
RxSwiftはUIKitの数だけメソッドがあります。
こちらのページがRxで実装できるクラスの一覧です。
めちゃくちゃ多いですね。大体のUIKitをRxで書ける事がわかります。
その中でもよく使いそうなものをチョイスして紹介しようと思っているのですが、
簡単な順から
- UISwitch
- UINotification
- UIScrollView
- UISession
この辺りをメインに解説していきたいと思います。
今回はUISwitch
について説明します。
Storyboardの構成について
今回のStoryboardの構成は下の画像の通りです。
UIButtonとUISwitchだけを使います。
ViewController側のソースコードについて
ではViewController側のソースコードをサクッと載せていきます。
Rxの書き方に慣れてくるとだいたい想像ができるようになります。
ViewController.swift
import UIKit import RxCocoa import RxSwift class ViewController: UIViewController { @IBOutlet weak var button: UIButton! @IBOutlet weak var sw: UISwitch! let disposeBag = DisposeBag() override func viewDidLoad() { super.viewDidLoad() // UIbuttonが押せる時は「押せます」のタイトル button.setTitle("押せます", for: .normal) // UIbuttonが押せない時は「押せません」のタイトル button.setTitle("押せません", for: .disabled) // UISwitchのvalueを変数でとります。 // 返り値は RxSwift.Observable<Self.E> let termsValidation = sw .rx.value .share(replay: 1) // ここでObservableの変数をデータバインディングします termsValidation .bind(to: button.rx.isEnabled) .disposed(by: disposeBag) } }
以上となります。
各所、処理の部分にコメントを記載していますので行数が少し増えています。
let termsValidation = sw .rx.value .share(replay: 1)
このコードでUISwtich のObservableな状態を変数にします。
そのあとにObservableなUISwitchのvalueとUIBbuttonの状態(UIButton#isEnable)をデータバイディングしますので
termsValidation .bind(to: button.rx.isEnabled) .disposed(by: disposeBag)
このようにコードを書きました。
これでアプリを起動させるとUISwitchをタップする度にUIButtonの状態を変化させることができます。
UISwitchがonの時
UISwitchがoffの時
このように変化します。
UISwitchはon/offの切り替えぐらいしか実装が思いつかないのでRxを使うとなると上記のパターンぐらいしか思いつきません。
これでUISwitchのRxの書き方がわかりました。