[swift] 入力中にキーボードを非表示にする
こんばんは。エンジニアの高橋です。
私がよく使う入力欄以外をタップした際に、キーボードを消す方法をご紹介します。
キーボードを非表示
class ViewController: UIViewController { // 非表示に使用するテキストフィールド @IBOutlet weak var textField: UITextField! override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { if textField.isFirstResponder() { textField.resignFirstResponder() } } }
textField
にフォーカスが当たっているかの判定処理を行い、
枠外の場合はキーボードを非表示にしています。
この方法では、テキストフォールドそれぞれに設定ができるため、
「テキストフィールド1では枠外でキーボードを非表示にしたいけど、テキストフィールド2では非表示にしたくない 」
という処理も実現できます。(あまりないシュチュエーションかと思いますが...)
記述量を減らす
テキストフィールドそれぞれに設定するのが面倒くさいから、
どれかを入力中に枠外をクリックしたら非表示にしてくれという方にはこちらが簡単です。
class ViewController: UIViewController { override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { view.endEditing(true) } }
textField
のインスタンスの代わりにview
を使用する事で同じ事ができます。
view
はUIViewControllerのviewです。
エンターでキーボードを非表示
上で紹介した方法は、枠外をクリックした場合に非表示にするやり方でしたが
キーボードのエンターを選択した場合にも同様の事ができます。
class ViewController: UIViewController { @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() textField.delegate = self } } extension ViewController: UITextFieldDelegate { func textFieldShouldReturn(textField: UITextField) -> Bool { textField.resignFirstResponder() return true } }
UITextFieldDelegate
を継承し、delegate
を設定するだけでできます。
delegateなどを実装する際はextension
を使用する事で、
ソースの分離ができ見通しが良くなるためオススメです。
RxSwiftなどを使うとUITextFieldDelegate
を継承せずに実現できるのですが、
そのやり方はまた今度ご紹介します!