ミライスタート TECH系ブログ

株式会社ミライスタートのエンジニア達が気になったTECH系の記事等をアップしています!

[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を継承せずに実現できるのですが、
そのやり方はまた今度ご紹介します!