UITextFieldに入力時、キーボードタイプをNumber PadにするとReturnキーが無くてtextFieldShouldReturn
で閉じることが出来なくて困ったのでキーボードを閉じる方法を調べました。
キーボードを閉じる方法 その①
UITextFieldDelegate
のtextFieldShouldReturn
にキーボードを閉じる処理を書いて、キーボードのリターンキーを押すとキーボードが閉じてくれる方法
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
その方法で困った事
キーボードタイプがNumber Padだとリターンキーが無くて困った。
textFieldShouldReturn
が使えないじゃないか、、、

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

こんな感じでキーボード上に完了ボタンを出現させる。
@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 Recognizer
をViewController
に配置

2.Tap Gesuture Recognizer
をcontrol
+ ドラッグでViewController
と紐付け

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
の完了ボタンと画面タップでキーボードを閉じています。
まとめ
些細なことから調べ出したら色んな方法を知ることが出来た。
これも参考にさせてもらった記事のおかげです。
ありがとうございました。
是非、参考元の記事も見に行ってみてください☺︎
また何か間違いやより良い方法がありましたら、優しく教えていただけると幸いです🙇♂️
参考
UTextFieldのソフトキーボードを数値のみにして完了ボタンを追加する
[Swift]キーボード以外をタッチするとキーボードが下がる方法
Apple公式ドキュメント: endEditing(_:)