LoginSignup
3
2

More than 3 years have passed since last update.

【Swift】UITextFieldDelegate でキーボードの挙動を実装するサンプル

Last updated at Posted at 2021-02-06

概要

UITextFieldDelegate を使ってキーボードを閉じたときの挙動を実装するサンプルです。

前提

言語 : Swift 5
開発環境 : Xcode 12

サンプルコード

ViewController.swift
class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var searchTextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
    // searchTextField のデリゲートを ViewController が受け取る
        searchTextField.delegate = self
    }

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

    func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
      if textField.text != "" {
        textField.placeholder = "Search"
        return true
      } else {
        textField.placeholder = "入力してください"
        return true
      }
    }

    func textFieldDidEndEditing(_ textField: UITextField) {
        if let text = searchTextField.text {
            print(text)
        }
        searchTextField.text = ""
    }

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

textFieldDidEndEditing

テキストフィールドの編集が停止したときにデリゲートに通知するメソッド。
サンプルコードでは、テキストフィールドの値を出力して入力を空欄に変更しています。


func textFieldDidEndEditing(_ textField: UITextField) {
// オプショナルバインディング
    if let text = searchTextField.text {
      print(text)
    }    
    searchTextField.text = ""
}

textFieldShouldReturn

キーボードの Return をタップしたら呼ばれるメソッド。
呼ばれたらファーストレスポンダから解除し、キーボードを非表示にする役割を担っています。


func textFieldShouldReturn(_ textField: UITextField) -> Bool {
// ファーストレスポンダから解除し、キーボードを非表示にする
    searchTextField.endEditing(true)
    return true
}

textFieldShouldEndEditing

テキストフィールドの編集を停止するかデリゲートに問い合わせるメソッド。
ファーストレスポンダの状態を解除するように要求されたときに呼ばれています。
サンプルコードでは、テキストフィールドが空欄だった場合に placeholder の値を変更しています。


func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
// テキストフィールドが空欄じゃなかったら true
    if textField.text != "" {
      return true
    } else {
// テキストフィールドが空欄だったら placeholder を変更
      textField.placeholder = "入力してください"
      return true
    }
}

touchesBegan

画面をタッチしたときに呼ばれるメソッド。
オーバーライドすることでイベントを検知できます。
サンプルコードでは、画面をタッチしたときにキーボードを閉じる役割を担っています。

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

まとめ

似たようなメソッド名で混乱していましたが、調べてみるとそれぞれ呼ばれるタイミングや役割が異なっていることが分かってスッキリしました。

3
2
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
3
2