RxSwiftの簡単な機能を使ってみました。
インストール
CocoaPodsで下の3つをインストールします。
pod 'RxSwift', '~> 2.0.0-alpha' pod 'RxCocoa', '~> 2.0.0-alpha' pod 'RxBlocking', '~> 2.0.0-alpha'
テキストフィールドの入力イベントのサンプル
tf1とtf2の合計がtf3に反映されるサンプルを作ってみました。
import RxSwift import RxCocoa let tf1 = UITextField(frame: CGRect(x: 100, y: 100, width: 40, height: 20)) let tf2 = UITextField(frame: CGRect(x: 100, y: 150, width: 40, height: 20)) let tf3 = UITextField(frame: CGRect(x: 100, y: 200, width: 40, height: 20)) tf1.borderStyle = .Line tf2.borderStyle = .Line tf3.borderStyle = .Line view.addSubview(tf1) view.addSubview(tf2) view.addSubview(tf3) Observable.combineLatest(tf1.rx_text, tf2.rx_text) { (a: String, b: String) -> (Int, Int) in return (Int(a) ?? 0, Int(b) ?? 0) } .map { (a, b) in return "\(a + b)" }.bindTo(tf3.rx_text)
動かした所、自動でtf3に変更が反映されました。
tf3をUILabelに変えても問題なく動きました。
let tf1 = UITextField(frame: CGRect(x: 100, y: 100, width: 40, height: 20)) let tf2 = UITextField(frame: CGRect(x: 100, y: 150, width: 40, height: 20)) let lb = UILabel(frame: CGRect(x: 100, y: 200, width: 40, height: 20)) tf1.borderStyle = .Line tf2.borderStyle = .Line view.addSubview(tf1) view.addSubview(tf2) view.addSubview(lb) combineLatest(tf1.rx_text, tf2.rx_text) { (a: String, b: String) -> (Int, Int) in return (Int(a) ?? 0, Int(b) ?? 0) } .map { (a, b) in return "\(a + b)" }.catchError({ value -> Observable<String> in print(1) return Observable<String>() }).bindTo(lb.rx_text)
条件によってフィルタリングをする
filterを使うと特定の条件だけ値を反映させる事ができます。
let tf = UITextField(frame: CGRect(x: 100, y: 100, width: 40, height: 20)) let lb = UILabel(frame: CGRect(x: 100, y: 200, width: 40, height: 20)) tf.borderStyle = .Line view.addSubview(tf) view.addSubview(lb) tf1.rx_text.map { (text: String) -> String in text } .filter { value -> Bool in Int(value) != nil }.bindTo(lb.rx_text)
ボタンのタップイベント
ボタンがタップされた時にUILabelの中身が変わるサンプルを書いてみました。
let btn = UIButton(frame: CGRect(x: 100, y: 150, width: 200, height: 44)) btn.setTitle("Tap", forState: .Normal) btn.backgroundColor = UIColor.grayColor() view.addSubview(btn) let lb = UILabel(frame: CGRect(x: 100, y: 200, width: 40, height: 20)) view.addSubview(lb) btn.rx_tap.subscribeNext { value -> Void in lb.text = "AAA" }