ソフトウェアキーボードの表示状態を切り替える : Objective-C プログラミング

PROGRAM


ソフトウェアキーボードの表示状態を切り替える

iPhone アプリのプログラミングで、UITextField などにタッチした際などに表示されるソフトウェアキーボードを表示したり、非表示にする方法について調べてみました。

なお、処理の流れを追っていて、なかなかややこしいところがあったので、その辺りについてを UITextField のイベントやデリゲートの流れ の方に整理してみました。こちらも参考にしながら、下のお話を追ってみると分かりやすくなるかもしれないです。

FirstResponder にしてキーボードを表示する

iPhone や iPad では、UITextField をタップすると、画面上にソフトウェアキーボードが表示されます。

例えば入力フィールドが画面上に 1 つしかない等で、タップしなくても自動的にその入力フィールドのキーボードを表示させたい場合には、次のようにして、目的の UITextField に FirstResponder を設定します。

if ([target canBecomeFirstResponder])

{

[target becomeFirstResponder];

}

このようにして、対象となる UIView (厳密にはその派生元の UIResponder) を First Responder に設定することで、それにフォーカスが当たり、それが UITextField であればキーボードが表示されるようになります。

これを、目的の UITextField が配置されている UIVew の "viewWillAppear:" または "viewDidAppear:" 内で行えば、View が表示された直後からキーボードが表示される状態になります。

FirstResponder を解消してキーボードを非表示にする

上記と逆のやりかたで、画面上のソフトウェアキーボードを非表示にすることが可能です。

if ([target canResignFirstResponder])

{

[target resignFirstResponder];

}

ただ、この方法を使用するには、First Responder が設定されているオブジェクトを把握していなければいけません。

IBAction を設定して、何らかの操作の際に sender として対象オブジェクトが取得できる場合などには手軽な方法ですけど、そうでない場合は、次のような方法で、View の編集状態を解消するのが簡単です。

Enter 入力時にキーボードを非表示にする

UITextField で Enter を入力した時には "Did End On Exit" イベントが発生するようになっていますが、これに IBAction を割り当ててあげることで、Enter キーを押したときに、自動的にソフトウェアキーボードが隠れるようになるようでした。

- (IBAction)actionDidEndOnExit:(id)sender

{

}

インターネットで調べると、この "Did End On Exit" イベントで呼び出す IBAction 内で、先ほど紹介した "resignFirstResponder" を呼び出すことでソフトウェアキーボードを非表示にできるといった説明も散見できましたけど、自分で試してみている感じでは、この IBAction に特に何も実装しなくても、キーボードが非表示になってくれる感じでした。

View の編集状態を解消してキーボードを非表示にする

通常、UITextField の状態は、そのテキストフィールドを配置している UIViewController で行うことが多いと思います。

その場合は、次のようにして簡単に、キーボードを非表示にすることができます。

[self.view endEditing:YES];

ここでいう self というのは、UIViewController です。

このようにすることで、そのビューの編集状態が終了し、このときに UITextField でソフトウェアキーボードが表示された状態であれば、それが非表示になってくれる感じです。

もう少し細かく見ると、UIView の endEditing:YES が呼び出されることで、First Responder として編集状態になっている UITextField も endEditing:YES となり、UITextField の "Editing Did End" イベントが呼び出され、最終的に、キーボードが非表示になる感じのようです。

このとき、編集状態になっていない他の UITextField の "Editing Did End" イベントは呼び出されない感じでした。

キーボードを常に表示させておきたい場合

逆に、キーボードを常に表示させたい場合を考えてみます。

View 表示直後から UITextField を First Responder にして、ソフトウェアキーボードを最初から表示させておくことについては先ほどお話しました。

ここから、UIButton などをタップしても、そのまま First Responder が維持されるようで、キーボードは表示されたままになります。もしここでキーボードを非表示にしたい場合でも、先ほどお話した endEditing:YES で制御可能です。

 

さて、UITextField 上で Enter を入力すると、その時点でキーボードが非表示になるようになっているようでした。

これを常に表示させておくようにするには、まず、UITextField を配置した UIViewController のヘッダーファイルで <UITextFieldDelegate> を実装した上で、対象の UITextField の delegate として、その UIViewController を設定します。

@interface aViewController : UIViewController <UITextFieldDelegate>

{

そして、UITextFieldDelegate の "textFieldShouldReturn:" メソッドを実装して、戻り値として NO を返すようにします。

- (BOOL)textFieldShouldReturn:(UITextField*)textField

{

return NO;

}

このようにすると、textField で Enter を入力した際の既定の動作が無効になるので、それによって、キーボードを非表示にするという処理も無効にすることができました。

[ もどる ]