初めてのiOSアプリケーション編最終話となりました。
今回はソフトウェアキーボードでDoneを押した時の処理を実装していきます。
【Objective-C】XcodeでiPhoneアプリを作る基礎を学ぶ5【『初めてのiOSアプリケーション』その3】 | naonotes.com(ナオノーツ)なぜキーボードが消えない?
テキストフィールドのソフトウェアキーボードはどうしてDoneを押しても消えないのか?
って考えるよね。
そもそもその考え方が間違ってる。
なぜテキストフィールドをクリックするとソフトウェアキーボードが現れるのか?
が正解。
だって、テキストフィールドをクリックしたらソフトウェアキーボードが出るようにする、なんてコードはどこにも書いてない。
なのになぜ現れるのか?
その答えは、iOSではテキストフィールドに文字が入力出来る状態になると、自動でソフトウェアキーボードが現れる仕様になっている。
だから、入力状態になっている限りソフトウェアキーボードは消えない。
なんと理不尽な答えと思っても、そういう仕様なんです。
Appleが決めたことなんです。
それに逆らうことなんて出来ません。
黙って従うのがベストです。
Doneをタップした時にフォーカスが外れるようにすると、ソフトウェアキーボードも消えるって事なので、そういう処理を書いていこう。
UITextFieldDelegateプロトコルの実装
なんだか訳わからない言葉が出てきたね。
これは、Xcodeにはユーザーがいちいち細かい処理を書かなくてもいいように、元々大量に処理(プロトコル)が実装されてる。
その1つがUITextFieldDelegate。
だから、UITextFieldDelegateを使いますよって記述するだけで、XcodeがUITextFieldDelegateの中に書かれている処理を使えるようにしてくれる。
賢いね。Xcode。
おぼろげにわかったところで記述しよう。
インターフェース宣言に書き足す
ViewController.hを開く。
@interface HelloWorldViewController : UIViewControllerに <UITextFieldDelegate>を書き足し、
@interface HelloWorldViewController : UIViewController <UITextFieldDelegate>
にする。
これでViewControllerはUITextFieldDelegateの機能を使えるようになった。
メソッド(処理)を記述
さて、それではDoneキーを押したときに入力状態を解除するメソッドを記述していこう。
ViewController.mを開く。
前回記述した- (IBAction)メソッドの下にでも記述しよう。
そこに下記コードを記述する。
コピペじゃなくきちんと書いたほうがいいよ。
じゃないと覚えないよ。
– (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == self.textField) {
[theTextField resignFirstResponder];
}
return YES;
}
また前回のように1行ずつ説明していこう。
– (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
これはメソッドの書き出し。
前回のボタンの処理の書き出しである- (IBAction)〜はXcodeが自動で作ってくれたが、今回は自分で書かなきゃいけない。
世知辛いね。
– (BOOL)textFieldShouldReturn:(UITextField *)変数名 {
この行は、深いことを考えず丸ごと覚えた方がいい。
テキストフィールドにフォーカスされてソフトウェアキーボードが出てくるけど、Done(Return)をタップしたときの挙動をどうするか、っていう意味。
深く考えるよりも、これを書けばDoneキーをタップした挙動を決められると覚えた方が早い。
if (theTextField == self.textField) {
これは、入力状態のテキストフィールドがViewController.hに記述されているプロパティのtextFieldと同一のものなら、という意味になる。
ドキュメントにはテキストフィールドは1つしかないので別に書かなくてもいいけど、沢山テキストフィールドがある場合、エラーを防ぐことになるので記述した方がいいでしょう。と書いてあった。
ちょっと意味がわからないね。
[theTextField resignFirstResponder];
これは、入力状態(FirstResponder)のテキストフィールドを解除(resign)するという意味。
これで入力状態が解除され、ソフトウェアキーボードが消えるって事だね。
return YES;
始まりがBOOL(YESかNOかを返答する)なのでYESを返しているが、今回の場合はYESでもNOでもどっちでもかまわない。
YESが帰ってきた場合とかそういう処理を記述していないので。
Doneを押した段階で入力状態が解除され、キーボードが閉じる。
シミュレータを起動してみよう
シミュレータを起動してテキストフィールドを入力状態にし、Doneをクリックしてみると・・・
閉じた!
ユーザー名を入れてボタンを押すと・・・
Hello,kyoji kuzunoha!と表示された!
これは嬉しすぎる。
とりあえずHelloWorld完成!
ドキュメントを見ると、これで完成みたい。
お疲れ様!
と思ったんだけど、if (theTextField == self.textField) { がなぜ必要なのか気になるので実験してみた。
もう一つテキストフィールドを作成
実験用にテスト用テキストフィールドを作成した。
上にあるテキストフィールドと作成方法は同じ。
ただし、名前は同一には出来ないので、アウトレット接続時にtestTextFieldとした。
シミュレータを起動し、テストで作成したテキストフィールドをクリックしてDoneを押してみると・・・
閉じない。
if (theTextField == self.textField) { を削除
if (theTextField == self.textField) { を削除し、下記のようにコードを変更した。
– (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
[theTextField resignFirstResponder];
return YES;
}
シミュレータを起動し、テストで作成したテキストフィールドをクリックしてDoneを押してみると・・・
閉じた。
ということは、if (theTextField == self.textField) { はどのテキストフィールドかを識別しているって事だね。
これがないとすべてのテキストフィールドに同じ仕様を適用してしまう、って事みたい。
なるほど。
簡単なプログラムでも難しいね
さて、初めてのiOSアプリケーションを作ってみてどうだったでしょうか。
プログラマの人から見れば簡単すぎて片手で出来るようなものだけど、まったくわからない人から取ってはとてつもなく高い山に見えるね。
でも色々いじっているうちにちょこっとずつわかってくるから、是非挑戦してみて欲しいところ。
あと、終わってからまた『初めてのiOSアプリケーション』を読むとわかってくるところもあるので、再び目を通してみてください。
初めてのiOSアプリケーション(PDF)
お疲れさまです。
感激しました。コピペじゃなく、一から入力してみます。
当たり前って思って使ってるアプリにもっと愛情をもとうと思える数日間でした。少し頑張って作業してみます。
ドキュメント通りにやっただけですけどねw
ドキュメントには詳しく書いてあるので、
それを見てやった方が理解が深まると思いますよ。
かしこまりました。ありがとうございます。
猿真似が終わったら、色々見ながらやってみます。
お疲れ様です(^^ゞ
うまくいかないな〜って思ったら大文字が小文字だったり、文字を入れ間違えだったり・・・何度もエラーでて、昔のドラクエの復活の呪文を思い出しましたw
関係ないけど、昨日さくらのVPSの設定をした時に「【VPSに】ドメインを取ろう【割り当て】」の記事がすごく参考になりました。
きっとこれからアプリを作ろうとしてる人にも、この記事が役に立つこともあるハズ(^^)/
コードを書いてるうちに慣れてきて、
何となく意味がわかってくるとやたら面白いですw
でも、慣れるまでがきついですね(;´Д`)w
おつかれさまです m(__)m
私みたいな初心者でもすごくわかりやすかったです★
最初はコードなども全然わかりませんでしたが書いているうちにわかってきました
ありがとうございます
おお、それはよかったです。
四則演算計算機の方もオーバーフロー時の処理方法が思いつかなくて頓挫してますけど、
それなりのものは出来ますよw
色々試してみてください。