UITextFieldとRxSwiftを使ってバリデーションを実装する

概要

UITextFieldとUILabelをRxSwiftでバインディングする方法

blog.tamappe.com

では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

の書き方が一番親近感があったりします(笑)。 .subscribeAndroidでも同じですのでAndroidでRxを書いた場合でも補完とかで出てきてサクサク書けます。

ここまで書ければRxSwiftの基本的な考え方が分かってくるのではないかなと思いました。