LoginSignup
40
43

More than 5 years have passed since last update.

キーボードを閉じる動作の実装

Posted at

以下の2つの動作に合わせてキーボードを閉じるというシナリオを想定している。

  1. テキストフィールド(UITextField)での入力中にEnterを押した場合
  2. テキストフィールドでの入力中にキーボード以外の場所をタップした場合

StoryBoardメインで実装する場合

Enterを押した際の挙動は、UITextFieldの"Did End On Exit"イベントをバインドしたメソッド(以下の図ではonReturn:)で制御する。

onEnter_storyboard.png

onReturn:の実装は以下の通り。

Enter押下時にキーボードを閉じる処理
- (IBAction)onReturn:(UITextField *)sender {
    [sender resignFirstResponder];
}

resignFirstResponderを呼び出すことで、現在イベントを最初に受け取る状態になっている(=ファーストレスポンダになっている)のを解除することができる。
UITextFieldであれば、ファーストレスポンダ=キーボードが表示されている状態、と考えてよいのだろうか。(まだ正確な理解には至らず)

一方、キーボード以外の場所をタップした場合の挙動は、TapGestureRecognizerを使って実装する。
XCodeの右下のパレットからTap Gesture Recognizerを選択し、該当するビュー(キーボードを表示する際に下にあるビュー)にドラッグ&ドロップする。

スクリーンショット_2014-08-25_1_34_31.png

その後、Tap Gesture Recognizerをメソッド(以下の図ではonSingleTap:)にバインドする。

スクリーンショット_2014-08-25_1_32_17.png

onSingleTap:の実装は以下の通り。

- (IBAction)onSingleTap:(UITapGestureRecognizer *)sender {
    [self.view endEditing:YES];
}

UIViewendEditing:を呼ぶと、自身のサブビューがファーストレスポンダであった場合にそれを解除してくれるようだ。
ファーストレスポンダとなるものが複数存在する場合(etc. テキストフィールドが複数)でも問題なく処理できるため、こちらを使った方がいろいろと楽なのかもしれない。

コードメインで実装する場合

Enterを押した際の挙動は、UITextFieldDelegatetextFieldShouldReturn:メソッドで定義する。
delegateをセットする必要があるため、テキストフィールドをOutletとしてバインドする。

スクリーンショット 2014-08-25 1.57.37.png

viewDidLoad内でテキストフィールドのdelegateをセットする。
textFieldShouldReturn:の実装は、StoryBoardの場合と殆ど変わらないが戻り値を要求されるためそこだけ変更する。

スクリーンショット 2014-08-25 1.58.54.png

キーボード以外の場所をタップした場合の挙動は、UITapGestureRecognizerを自前でセットすることで実装できる。

UITapGestureRecognizerインスタンス生成時に、タップ時に呼ばれるメソッド(以下の図ではonSingleTap:)とレシーバ(以下の図ではself)を指定する。
生成したUITapGestureRecognizerインスタンスは、addGestureRecognizer:メソッドで、ViewController配下のビュー(=キーボードを表示する際に下にあるビュー)に追加する。
onSingleTap:の実装は、StoryBoardの場合と変わらない。

スクリーンショット 2014-08-25 2.08.49.png

追記

書いたあとに同内容の記事があることに気付くorz
こちらの記事の方が簡潔にまとまっています。
http://qiita.com/qt6hy/items/88fdd6c2c1485200ba97

40
43
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
40
43