概要
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)
}
まとめ
似たようなメソッド名で混乱していましたが、調べてみるとそれぞれ呼ばれるタイミングや役割が異なっていることが分かってスッキリしました。