LoginSignup
13
11

More than 3 years have passed since last update.

【Swift】UITextFieldのキーボードを閉じる方法

Last updated at Posted at 2021-01-24

UITextFieldに入力時、キーボードタイプをNumber PadにするとReturnキーが無くてtextFieldShouldReturnで閉じることが出来なくて困ったのでキーボードを閉じる方法を調べました。

キーボードを閉じる方法 その①

UITextFieldDelegatetextFieldShouldReturnにキーボードを閉じる処理を書いて、キーボードのリターンキーを押すとキーボードが閉じてくれる方法

 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

その方法で困った事

キーボードタイプがNumber Padだとリターンキーが無くて困った。
textFieldShouldReturnが使えないじゃないか、、、

numberpadWithDone

キーボードを閉じる方法 その②

InputAccesoryViewに完了ボタンを追加して、ボタンをトリガーにしてキーボードを閉じてもらう方法

numberpad

こんな感じでキーボード上に完了ボタンを出現させる。

@IBOutlet weak var numberPadTextField: UITextField!

override func viewDidLoad() {
        super.viewDidLoad()

        //inputAccesoryViewに入れるtoolbar
        let toolbar = UIToolbar()

        //完了ボタンを右寄せにする為に、左側を埋めるスペース作成
        let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace,
                                    target: nil,
                                    action: nil)
        //完了ボタンを作成
        let done = UIBarButtonItem(title: "完了",
                                   style: .done,
                                   target: self,
                                   action: #selector(didTapDoneButton))

        //toolbarのitemsに作成したスペースと完了ボタンを入れる。実際にも左から順に表示されます。
        toolbar.items = [space, done]
        toolbar.sizeToFit()

        //作成したtoolbarをtextFieldのinputAccessoryViewに入れる
        numberPadTextField.inputAccessoryView = toolbar

        //キーボードタイプを番号のみに指定
        numberPadTextField.keyboardType = .numberPad
    }

    //完了ボタンを押した時の処理
    @objc func didTapDoneButton() {
        numberPadTextField.resignFirstResponder()
    }

キーボードを閉じる方法 その③

ViewControllerにTap Gesture Recognizerを配置して、画面をタップされたらキーボードを閉じる方法

1.Tap Gesuture RecognizerViewControllerに配置

tapgesture

2.Tap Gesuture Recognizercontrol + ドラッグでViewControllerと紐付け

tapgesture2

3.紐付けしたTap Actionにキーボードを閉じる処理を書く

@IBAction func didTapView(_ sender: UITapGestureRecognizer) {
        //キーボードを閉じる処理
        view.endEditing(true)
    }

なんでview.endEditing(true)がキーボードを閉じてくれるのか?

公式ドキュメントより引用

Causes the view (or one of its embedded text fields) to resign the first responder status.

ビュー(またはその埋め込みテキストフィールドの1つ)にファーストレスポンダーステータスを辞任させます。

ということでview.endEditing()の引数にtrueを入れると、キーボードが現れている場合はtextField.resignFirstResponder()してくれるのでキーボードを閉じてくれます。

キーボードを閉じる方法 その④

その③の画面タップという方法は同じですが、実装がスマートなパターン

Tap Gesture Recognizerを配置したり、ファイルに紐付けたりしなくて良いです。

これを宣言するだけ。

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        view.endEditing(true)
    }

サンプルデモ

キーボード上のinputAccesoryViewの完了ボタンと画面タップでキーボードを閉じています。
イメージ.GIF

まとめ

些細なことから調べ出したら色んな方法を知ることが出来た。
これも参考にさせてもらった記事のおかげです。
ありがとうございました。
是非、参考元の記事も見に行ってみてください☺︎

また何か間違いやより良い方法がありましたら、優しく教えていただけると幸いです🙇‍♂️

参考

UTextFieldのソフトキーボードを数値のみにして完了ボタンを追加する
[Swift]キーボード以外をタッチするとキーボードが下がる方法
Apple公式ドキュメント: endEditing(_:)

13
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11