UITextFieldとRxSwiftを使ってバリデーションを実装する
概要
UITextFieldとUILabelをRxSwiftでバインディングする方法
ではUITextFieldとUILabelを接続してUITextFieldで入力中の値をリアルタイムでUILabelに更新していく方法が分かりました。 とは行ってもRxSwiftを使わない方法でもUITextFieldDelegateのメソッドを使うことと変わりません。
(もっと言えば実務で共同開発だとXcodeでデリゲートメソッドの検索を行うのでそれが使えなくなる方が面倒な気がしますけど。)
今回はさらにUITextFieldにバリデーションをかける方法について説明していきたいと思います。
開発環境について
Xcode: 10.1
Swift: 4.2
RxSwift: 4.4.0
RxCocoa: 4.4.0
ソースコードについて
ViewController.swift
import UIKit import RxCocoa import RxSwift class ViewController: UIViewController { @IBOutlet weak var button: UIButton! @IBOutlet weak var label: UILabel! @IBOutlet weak var textField: UITextField! var disposeBag = DisposeBag() var count = 0 override func viewDidLoad() { super.viewDidLoad() textField.rx.text.asObservable() .subscribe(onNext: { text in if text?.isEmpty == true { print("empty") self.textField.becomeFirstResponder() } }).disposed(by: disposeBag) } }
こんな感じです。 UITextField の中身が空の時にだけコンソールに"empty"と表示されるソースコードとなります。
僕にとっては
VC.swift
textField.rx.text.asObservable() .subscribe(onNext: { text in
の書き方が一番親近感があったりします(笑)。
.subscribe
はAndroidでも同じですのでAndroidでRxを書いた場合でも補完とかで出てきてサクサク書けます。
ここまで書ければRxSwiftの基本的な考え方が分かってくるのではないかなと思いました。