【Swift】UITextFieldのデリゲートメソッドが呼び出されるタイミングを確認する。(Swift 2.1、XCode 7.2)
UITextFieldのデリゲートメソッド
前回の記事でUITextFiledDelegateプロトコルに定義されているメソッドの一覧を「Jump to Definition」を利用して調べた。⇒「記事」
そこで、本記事ではUITextFieldDelegateプロトコルに定義されているメソッドの実行タイミングを確認しておくことにする。
textFieldShouldBeginEditingメソッド
テキストフィールドをタップして文字が入力可能になる直前にメソッドが呼び出される。戻り値にtrueを返せば文字が入力可能な状態になり、falseを返せば入力不可としてキーボードは表示されない。
textFieldDidBeginEditingメソッド
テキストフィールドをタップして文字が入力可能になった直後にメソッドが呼び出される。このように、デリゲートメソッドにはメソッド名の中にShouldまたはDidが含まれるものが多い。
Shouldは直前、Didは直後と覚えておけば、どのタイミングで呼ばれるのかをイメージしやすい。
このメソッドはDidなので Shouldよりもあとに実行される。なので、以下のコードを実行した場合、ラベルには「入力開始後に呼び出し」が表示される。
1 2 3 4 5 6 7 8 9 10 |
func textFieldShouldBeginEditing(textField:UITextField) -> Bool { testLabel.text = "入力開始前に呼び出し" return true } func textFieldDidBeginEditing(textField:UITextField) { testLabel.text = "入力開始後に呼び出し" } |
textFieldShouldEndEditingメソッド
Returnキーを押してテキストフィールドの入力が完了する前にメソッドが呼び出される。戻り値にtrueを返した場合はそのまま入力完了となり、falseを返せば入力完了を拒否するためキーボードは表示されたままになる。
textFieldDidEndEditingメソッド
Returnキーを押してテキストフィールドの入力が完了した後にメソッドが呼び出される。Shouldのメソッドよりもあとに実行されるので、以下のコードを実行した場合、ラベルには「入力完了後に呼び出し」が表示される。
1 2 3 4 5 6 7 8 9 |
func textFieldShouldEndEditing(textField:UITextField) -> Bool { testLabel.text = "入力完了前に呼び出し" return true } func textFieldDidEndEditing(textField:UITextField){ testLabel.text = "入力完了後に呼び出し" } |
textFieldメソッド
テキストフィールドの値が変更される度にメソッドが呼び出される。第1引数には変更前の文字列、第2引数には変更される文字列のインデックス範囲、第3引数には新しい文字列が渡ってくる。戻り値にtrueを返せばテキストフィールドへの入力が確定し、falseを返せば入力確定を拒否する。
textFieldShouldClearメソッド
クリアボタンを押してテキストフィールドの文字列がクリアされる直前にメソッドが呼び出される。
クリアボタンとは、テキストフィールドの右端に表示されている×ボタンのことで、最初は非表示に設定されている。表示するには、テキストフィールドの部品をクリックしてから、画面右側のアトリビュートインスペクタボタン(下図黄枠)をクリックし、下図赤枠のClear Buttonの設定を「Is always visible」などに変更する。
textFieldShouldReturnメソッド
Returnキーを押したと判定される直前にメソッドが呼び出される。先ほど説明したtextFieldShouldEndEditingメソッドtextFieldDidEndEditingメソッドはendEditingメソッドが実行された段階で呼び出されるので、以下のコードを実行した場合、ラベルには「キーボードを閉じた後」が表示される。
また、「キーボードを閉じた後」に設定するコードを削除して実行すると「入力完了前に呼び出し」が表示される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
func textFieldShouldEndEditing(textField:UITextField) -> Bool { testLabel.text = "入力完了前に呼び出し" return true } func textFieldShouldReturn(textField:UITextField) -> Bool { testLabel.text = "キーボード閉じる前" //キーボードをしまう self.view.endEditing(true) testLabel.text = "キーボード閉じた後" return true } |