Objective-C入門その12:MyViewController.m一気読み

サルでき.jp > 11.サルにもできるiPhoneアプリの作り方(旧アメブロ記事) > Objective-C入門その12:MyViewController.m一気読み

2009/09/21 09:00 投稿先 11.サルにもできるiPhoneアプリの作り方(旧アメブロ記事) 投稿者 カワサキ タカシ

てさて~。ぐいぐい前に~。

前回思いのほかサクっと読めてしまいましたね。
Objective-C入門その11:MyViewController.h一気読み

これは落とし穴の可能性大です。

さっそくその気配を感じていただきましょう。
この記事をサラーっとスクロールしてみてください。

長。

おっと!
×ボタン押さない!

書いてるこっちだって辛いんですよ!
同じ辛さは共有していこうじゃありませんか!
無理矢理ですか!

知ってます。

ま、お茶でも用意していただいて。
ゆるゆるとご覧ください。

MyViewController.m
カスタムビューコントローラークラス、メイン(クラスの実装)

#import “MyViewController.h”
こっちは実装ファイルなので、宣言を読み込みます。

@implementation MyViewController
ここからMyViewControllerクラス、実装の開始です。

@synthesize textField;
@synthesize label;
@synthesize string;
3つまとめてアクセサメソッドの自動生成用コンパイラディレクティブです。
textField、label、string。ヘッダーで宣言した3つをそれぞれ生成指示してます。

で、ここからが長いのですが。
よーく見ると5つのメソッドに分かれています。

1個1個は短そうなので、区切って見ていきましょう。

その1

- (void)viewDidLoad {
宣言もしてないのに実装してるメソッド、来ました。
実はコイツはUIViewControllerで宣言されています。

ビューの読み込みが完了した直後に動くメソッドです。

スーパークラスとしてUIViewControllerを指定した上で、
実装部分でスーパークラスのメソッドを記述する。

つまり、上書きしているわけです。
これをオブジェクト指向的に言うとオーバーライドと言います。

// When the user starts typing, show the clear button in the text field.
textField.clearButtonMode = UITextFieldViewModeWhileEditing;
ここら辺は制作者がコメントを書いてくれています。
ビバコメント。何をやっているかがぐっとわかりやすくなりますね。
Objective-C入門その1:まずはコメントの書き方から

どれどれ。。。
ユーザーさんが文字を入力している間に、テキストフィールド内にクリアボタンを表示する。
Objective-C入門その12:MyViewController.m一気読み
コレの右側の×のことですね。確かに編集を開始すると出てきます。

テキストフィールドのクリアボタンモードを、UITextFieldViewModeWhileEditingにする。
UITextFieldViewModeWhileEditingは定数ですね。予め決められた値です。

長いわ!

// When the view first loads, display the placeholder text that’s in the
// text field in the label.
label.text = textField.placeholder;

はじめてビューが読み込まれた時は、placeholderの文字を表示ラベルの文字として表示する。
Objective-C入門その12:MyViewController.m一気読み
何もしないと「Hello, World!」と出てきます。

ではこの文字はドコで設定しているかと言うと、
Objective-C入門その12:MyViewController.m一気読み
ビューの設定の方にありました。
確かにplaceholderって書いてあります。
テキストフィールド自体の初期設定のことですね。

}
1個目はここまで。
クリアボタンの設定と、初期表示文字の設定のお話でした。

その2

- (void)updateString {
どっかで見ましたね。
そう、これはちゃんとヘッダーの中で宣言したメソッドです。
Objective-C入門その11:MyViewController.h一気読み

// Store the text of the text field in the ‘string’ instance variable.
self.string = textField.text;
テキストフィールドのテキストを、stringというインスタンス変数にしまえ。

// Set the text of the label to the value of the ‘string’ instance variable.
label.text = self.string;
しまっておいたstringを、表示ラベルの文字にセットしろ。

}
バケツリレーのお話でした。

その3

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
またまた宣言もしてないのに実装してるメソッド、来ました。
コイツはUITextFieldDelegateで宣言されています。

// When the user presses return, take focus away from the text field so that the keyboard is dismissed.
やることは、と。

リターンボタンを押した時に、
テキストフィールドからフォーカスを外してキーボードを非表示にしてね。ですね。
ちょっとプログラムっぽく、IF文が書いてあります。

if (theTextField == textField) {
引数で渡されたtheTextFieldがインスタンス変数のtextFieldと同じだったら、

[textField resignFirstResponder];
textFieldをファーストレスポンダー(要はフォーカス)から外し、

// Invoke the method that changes the greeting.
[self updateString];
updateStringメソッドを実行し、

}

return YES;
YESを戻り値として返す。

}
この流れで、キーボードがシュッと隠れます。
調べてみると、
何もしないとテキスト編集時(リターン押下時)にキーボードが隠れてくれないらしく、
コレを書くのがお作法のようです。そのまま覚えちゃいましょう。

その4

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
これまたナニモノかしら?と思うようなメソッドです。
でも名前にtouchが入ってますね。

そうなんです。
お待たせしました。
touchを感知するイベントが、まさにこちらでございます。

touchesBeganはタッチ開始を感知
touchesMoved:タッチ後、画面をドラッグを感知
touchesEnded:指を離すか、対象のビューの外に出ると感知
touchesCancelled:電話がかかってきたりして、アプリケーションが非アクティブになると感知

今回は、touchesBeganのみ実装されています。

// Dismiss the keyboard when the view outside the text field is touched.
テキストフィールド以外の場所をタッチされたら、キーボードを隠してね。ですね。

[textField resignFirstResponder];
さっきも出ましたね。第一応答者から外す。つまりフォーカス外しです。

// Revert the text field to the previous value.
textField.text = self.string;
テキストフィールドを前の状態に戻して、

[super touchesBegan:touches withEvent:event];
スーパークラスのタッチ開始メソッドを実行。
注:この書き方が具体的にどうなってんのかイマイチピンときておりません。
とりあえずこう書いておけば良い。ってくらいの認識です。

}
ダメなところタッチしたら処理してね。というお話。

その5

- (void)dealloc {
最後です。これはHelloWorldAppDelegateでも出てきたので瞬殺しておきましょう。

// To adhere to memory management rules, release the instance variables.
// ‘textField’ and ‘label’ are objects in the nib file and are created when the nib
// is loaded.
ちゃんと解放しとけ。ですね。

[textField release];
[label release];
[super dealloc];
textField、label、super。解放。

}
後片付けのお話でした。

@end
で、終了。と。

ここまでお読みになったみなさま。ご苦労様でした!

一応、それなりに読めましたね。
タッチっぽいイベントもいよいよ出てきました。

次回は Hello,World! の最終回。main.mの一気読みです。
すぱーっと読み切って次の段階に進みましょう!

関連する記事:


Advertisement