文字を入力するためのUIとしてUITextField がありますが、これはソフトキーボードが自動では閉じません。キーボードの閉じる方法を3つ考えてみます。
Xcode 9.4
UITextField キーボードを閉じる
UITextFieldのキーボードを閉じる方法は様々なケースに応じて以下の3つが考えられます。
resignFirstResponderを設定
キーボートを閉じる操作は自動ではやってくれない仕様になっていますが、フォーカスを外せばキーボードは隠れます。
resignFirstResponder()はフォーカスされている状態を外すためのメソッドです。
textFieldShouldReturnは「Return」や「改行」などのキーをタップした時に呼ばれますので、そのタイミングでresignFirstResponder()を設定するとキーボードを閉じることができます。
Storyboard に UITextField を配置して、入力した文字を表示する Label を下に置きます。見やすくするため Inspector area で背景をそれぞれグレーに設定します。
文字を Text Field に入力して、それを Label に表示するアプリを簡単に作ってみます。
UITextFieldDelegate を設定して Text Field のデータを受け取ります。
ViewController.h
1 2 3 4 5 6 7 8 |
#import <UIKit/UIKit.h> @interface ViewController : UIViewController<UITextFieldDelegate> @property IBOutlet UITextField *textField; @property IBOutlet UILabel *label; @end |
Delegate で受け取ったデータを TextField に渡し、
ラベルの文字として代入して、それが終わったらキーボードを閉じます。
ViewController.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // textFieldのDelegate通知をViewControllerで受け取る self.textField.delegate = self; } // UITextFieldのキーボード上の「Return」ボタンが押された時に呼ばれる処理 - (BOOL)textFieldShouldReturn:(UITextField *)sender { // 受け取った入力をラベルに代入 self.label.text = sender.text; // キーボードを閉じる [sender resignFirstResponder]; return TRUE; } @end |
storyboard の UITextField と UILabel をView Controller Scene に接続します。
ビルド実行すると、 TextField の入力文字が Label に反映されたと思います。
Did End On Exit を設定
別の方法としてstoryboardの設定と簡単なコードで実現するやり方です。
TextField は Referencing Outlet で textField に接続していますが
Set Events の Did End On Exit で IBAction としても接続します。
ViewController.h
1 2 3 4 5 6 7 8 9 |
#import <UIKit/UIKit.h> @interface ViewController : UIViewController<UITextFieldDelegate> @property IBOutlet UITextField *textField; @property IBOutlet UILabel *label; -(IBAction)getText:(id)sender; @end |
ViewController.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // textFieldのDelegate通知をViewControllerで受け取る self.textField.delegate = self; } -(IBAction)getText:(UITextField *)sender{ self.label.text = sender.text; } @end |
とてもシンプルになりました。
ボタン等でendEditingを使う方法
UIViewController を使っている場合であれば
[self.view endEditing:YES];
のようにしてキーボードを閉じることができます。
ViewController.h
1 2 3 4 5 6 7 8 9 |
#import <UIKit/UIKit.h> @interface ViewController : UIViewController<UITextFieldDelegate> @property IBOutlet UITextField *textField; @property IBOutlet UILabel *label; @end |
ViewController.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // textFieldのDelegate通知をViewControllerで受け取る self.textField.delegate = self; } // ボタンタップ - (IBAction)buttonTapped { self.label.text = self.textField.text; // keyboardを閉じる [self.view endEditing:YES]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end |
ボタン・アクションを紐付けします。
実際はボタンではなく別のタイミング(画面遷移)などをトリガーにする方が自然かもしれません。キーボードの「改行」「Return」をユーザーが使わないケースが多いのでこれを使って入力を保存することが必要な場合があります。
尚、Swift のケースはこちらです。
References:
UITextField – UIKit | Apple Developer Documentation
resignFirstResponder() – UIResponder | Apple Developer Documentation