【Objective-C】XcodeでiPhoneアプリを作る基礎を学ぶ6【『初めてのiOSアプリケーション』その4】

Xcode


初めてのiOSアプリケーション編最終話となりました。

今回はソフトウェアキーボードでDoneを押した時の処理を実装していきます。


【Objective-C】XcodeでiPhoneアプリを作る基礎を学ぶ5【『初めてのiOSアプリケーション』その3】 | naonotes.com(ナオノーツ)


なぜキーボードが消えない?


テキストフィールドのソフトウェアキーボードはどうしてDoneを押しても消えないのか?

って考えるよね。

そもそもその考え方が間違ってる。

なぜテキストフィールドをクリックするとソフトウェアキーボードが現れるのか?

が正解。

だって、テキストフィールドをクリックしたらソフトウェアキーボードが出るようにする、なんてコードはどこにも書いてない。

なのになぜ現れるのか?

その答えは、iOSではテキストフィールドに文字が入力出来る状態になると、自動でソフトウェアキーボードが現れる仕様になっている

だから、入力状態になっている限りソフトウェアキーボードは消えない。


skitchSmHoWp



なんと理不尽な答えと思っても、そういう仕様なんです。

Appleが決めたことなんです。

それに逆らうことなんて出来ません。

黙って従うのがベストです。

Doneをタップした時にフォーカスが外れるようにすると、ソフトウェアキーボードも消えるって事なので、そういう処理を書いていこう。



UITextFieldDelegateプロトコルの実装


なんだか訳わからない言葉が出てきたね。

これは、Xcodeにはユーザーがいちいち細かい処理を書かなくてもいいように、元々大量に処理(プロトコル)が実装されてる。

その1つがUITextFieldDelegate。

だから、UITextFieldDelegateを使いますよって記述するだけで、XcodeがUITextFieldDelegateの中に書かれている処理を使えるようにしてくれる。

賢いね。Xcode。

おぼろげにわかったところで記述しよう。


インターフェース宣言に書き足す


ViewController.hを開く。


skitchphkNXL



@interface HelloWorldViewController : UIViewControllerに <UITextFieldDelegate>を書き足し、

@interface HelloWorldViewController : UIViewController <UITextFieldDelegate>

にする。


skitchChcSYf



これでViewControllerはUITextFieldDelegateの機能を使えるようになった。



メソッド(処理)を記述


さて、それではDoneキーを押したときに入力状態を解除するメソッドを記述していこう。

ViewController.mを開く。


skitchZeTT89



前回記述した- (IBAction)メソッドの下にでも記述しよう。


skitchmnAsv2



そこに下記コードを記述する。

コピペじゃなくきちんと書いたほうがいいよ。

じゃないと覚えないよ。


– (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
  if (theTextField == self.textField) {
    [theTextField resignFirstResponder];
  }
  return YES;
}


skitchCYm1EV



また前回のように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をクリックしてみると・・・


skitchCZhAjX



閉じた!


skitchwABtE7



ユーザー名を入れてボタンを押すと・・・


skitchewrXdU



Hello,kyoji kuzunoha!と表示された!


skitchtCN1YZ



これは嬉しすぎる。



とりあえずHelloWorld完成!


ドキュメントを見ると、これで完成みたい。

お疲れ様!

と思ったんだけど、if (theTextField == self.textField) { がなぜ必要なのか気になるので実験してみた。


もう一つテキストフィールドを作成


実験用にテスト用テキストフィールドを作成した。

上にあるテキストフィールドと作成方法は同じ。


skitchostgav



ただし、名前は同一には出来ないので、アウトレット接続時にtestTextFieldとした。


skitchC6ulPC



シミュレータを起動し、テストで作成したテキストフィールドをクリックしてDoneを押してみると・・・


skitchAn3fza


閉じない。



if (theTextField == self.textField) { を削除


if (theTextField == self.textField) { を削除し、下記のようにコードを変更した。


– (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
   [theTextField resignFirstResponder];
   return YES;
}


skitch8Ob3ow



シミュレータを起動し、テストで作成したテキストフィールドをクリックしてDoneを押してみると・・・


skitchAn3fza


閉じた。


skitchXrg5gi


ということは、if (theTextField == self.textField) { はどのテキストフィールドかを識別しているって事だね。

これがないとすべてのテキストフィールドに同じ仕様を適用してしまう、って事みたい。

なるほど。



簡単なプログラムでも難しいね


さて、初めてのiOSアプリケーションを作ってみてどうだったでしょうか。

プログラマの人から見れば簡単すぎて片手で出来るようなものだけど、まったくわからない人から取ってはとてつもなく高い山に見えるね。

でも色々いじっているうちにちょこっとずつわかってくるから、是非挑戦してみて欲しいところ。

あと、終わってからまた『初めてのiOSアプリケーション』を読むとわかってくるところもあるので、再び目を通してみてください。


初めてのiOSアプリケーション(PDF)


【Objective-C】XcodeでiPhoneアプリを作る基礎を学ぶ6【『初めてのiOSアプリケーション』その4】」への7件のフィードバック

  1. bavarotti1981

    お疲れさまです。
    感激しました。コピペじゃなく、一から入力してみます。
    当たり前って思って使ってるアプリにもっと愛情をもとうと思える数日間でした。少し頑張って作業してみます。

    返信
    1. 葛葉 キョウジ(管理人) 投稿作成者

      ドキュメント通りにやっただけですけどねw
      ドキュメントには詳しく書いてあるので、
      それを見てやった方が理解が深まると思いますよ。

      返信
  2. 青りんご

    お疲れ様です(^^ゞ

    うまくいかないな〜って思ったら大文字が小文字だったり、文字を入れ間違えだったり・・・何度もエラーでて、昔のドラクエの復活の呪文を思い出しましたw

    関係ないけど、昨日さくらのVPSの設定をした時に「【VPSに】ドメインを取ろう【割り当て】」の記事がすごく参考になりました。
    きっとこれからアプリを作ろうとしてる人にも、この記事が役に立つこともあるハズ(^^)/

    返信
    1. 葛葉 キョウジ(管理人) 投稿作成者

      コードを書いてるうちに慣れてきて、
      何となく意味がわかってくるとやたら面白いですw
      でも、慣れるまでがきついですね(;´Д`)w

      返信
  3. チョコ

    おつかれさまです m(__)m

    私みたいな初心者でもすごくわかりやすかったです★
    最初はコードなども全然わかりませんでしたが書いているうちにわかってきました
    ありがとうございます

    返信
    1. 葛葉 キョウジ(管理人) 投稿作成者

      おお、それはよかったです。
      四則演算計算機の方もオーバーフロー時の処理方法が思いつかなくて頓挫してますけど、
      それなりのものは出来ますよw
      色々試してみてください。

      返信

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)