RxSwift

UITextFieldと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の基本的な考え方が分かってくるのではないかなと思いました。

ABOUT ME
tamappe
都内で働くiOSアプリエンジニアのTamappeです。 当ブログではモバイルアプリの開発手法について紹介しています。メインはiOS、サブでFlutter, Android も対応できます。 執筆・講演のご相談は tamapppe@gmail.com までお問い合わせください。