UITextFieldで入力判定を行う (UITextFieldTextDidChange)

はじめに

提供中のKeyHolderにて、UITextFieldで入力チェックを行っております。

f:id:project-unknown:20180305211123p:plain:w400

こんな感じでUITextFieldに何も入力されていない場合は、画面右上の保存を非表示にし、

f:id:project-unknown:20180305211335p:plain:w400

こんな感じでUITextFieldに入力されている場合は、画面右上の保存を表示しています。

やりかた

UITextFieldTextDidChangeを利用すると比較的簡単に実装できます。

以下は実装例です。

class SampleViewController: UIViewController {
    override func viewDidLoad() {
        NotificationCenter.default.addObserver(self, selector: #selector(SampleViewController.changeNotifyTextField(sender:)), name: NSNotification.Name.UITextFieldTextDidChange, object: nil)
    }
}

    public func changeNotifyTextField (sender: NSNotification) {
        guard let textView = sender.object as? UITextField else {
            return
        }
        if textView.text != nil {
            saveButton.isEnabled = textView.text != ""
        }
    }

senderの中に変更があったUITextFieldが入ってくるので、これをみて判断するだけです。

他の解決策

上記以外だったら、UITextFieldのDelegateを使うのも一手かもしれません、、、入力確定後の判定となるため、私はうまいやりかたを見つけられていません。

以下の例ではある程度の所は担保出来るのですが、上述通り予測変換等、入力確定前の情報がうまく取れません。

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

        var mutableText = ""
        if let textFieldString = textField.text {
            mutableText = mutableText + textFieldString
        }

        if mutableText == "" && string == "" {

        } else if (string == "") {
            mutableText = mutableText.substring(to: mutableText.endIndex)
        } else {
            mutableText = mutableText + string
        }

        saveButton.isEnabled = mutableText != ""
        
        return true
    }

ちなみに入力確認前の画面イメージは以下です。
f:id:project-unknown:20180305212128p:plain

UITextFieldTextDidChangeを使うと簡単に実現出来るので、こちらを使っておいたほうが良いかなと言う所感です。