2010/09/18からのアクセス回数 7702
iPadを買ってから、これなら自分の欲しいソフトを作ってもいいなぁと感じ、iPhone/iPadのプログラム 開発の勉強をすることにしました。
私は昔のプログラマーなので、まずは本を読んでどのように開発するかを勉強するところから はじめます。
今回参考にしたのは、以下の2冊です。
次に私が大切にしていることは、本の例題を自分で入力して動かしてみることです。
実際に自分が使ってみることで、
など、本には書いてないことが見えてきます。
iPhone/iPadの開発をするには、以下のものが必要になります。
私が、iPhone開発に二の足を踏んでいたのもSnow Leopardにアップグレードしないと最新のiPhone SDKを インストールできないからでした。*1
iPhone SDKでは、主にXcodeとInterface Builder(以下IBと省略)を使ってアプリケーションを作成します。
ここでは、入力したテキストをもう一方のラベルコピーするCopyTextという例題を作成しながら、 開発手順を説明します。
XCodeを起動し、「ファイル」→「新規プロジェクト」を選択すると、「テンプレート選択」ダイアログが表示するので、ここではiPHone OSの下のApplicationを選択し、テンプレートとしてView-based Applicationを選択し、名称をCopyTextとします。これで以下のようなプロジェクト画面が表示されます。*2
たったこれだけで、実際の動作するアプリケーションのひな形ができあがります。 試しに、「ビルドと実行」のボタンを押してiPhone Simulatorを実行してみると、
が表示されるはずです。
どうしてこんなに簡単にプログラムが作成され、実行するのかその仕組みをみてみましょう。
iPhoneアプリケーションの特徴は、「delegate」プロトコルとIBを使ったGUIの定義に あります。
プロジェクト画面でMainWindow.xibをダブルクリックするとIBが起動し、MainWIndow.xib画面に なにやら見慣れないアイコンが並んでいます。
各アイコンに定義された情報をもとにiPhoneは画面を 作成するのですが、その過程は以下のようになっています。*3
このようにIBを使ったプログラミングでは、viewControllerが制御のメインとなります。
IBの生成するXIBファイルとプログラム内のオブジェクトの橋渡しになっているが、IBOutletとIBActionです。
これから、Copy Text ViewControllerを編集しながら、IBOutletとIBActionの使い方を説明します。
CopyTextViewControllerの属性として、
を定義し、@properyにIBOutletキーワードを付けて定義します。
copyボタンが押されたときのアクションとして、copyを定義します。
入力時の補完について
@interface CopyTextViewController : UIViewController { UILabel *toLabel; UITextField *fromText; UIButton *copyButton; } @property(nonatomic, retain) IBOutlet UILabel *toLabel; @property(nonatomic, retain) IBOutlet UITextField *fromText; @property(nonatomic, retain) IBOutlet UIButton *copyButton; - (IBAction)copy; @end
@propertyで、属性へのアクセッサ(getter/setter)が自動生成されることを示します。
この段階では、@property宣言した属性を@synthesizeで属性へのアクセッサが生成されます。
copyアクションはコンソールへの出力を定義します。NSLogは、Cのprintfのようなものです。
@implementation CopyTextViewController @synthesize toLabel; @synthesize fromText; @synthesize copyButton; - (IBAction)copy { NSLog(@"copy method invoked"); }
プロジェクト画面でCopyTextViewController.xibをダブルクリックするとIBが起動します。 コマンド-シフト-Lでライブラリウィンドウが表示しますので、検索フィールドにfieと入力すると 一覧からTextFieldが選択されます。このTextFieldwをライブラリからviewにドラッグしたのが 以下の図です。
同様に
を配置します。
次にFile's Ownerを選択し、コマンド-2でconnectionタブに切り替え、先ほど定義したIBOutletのcopyButtonとcopyボタンを線で結びます。
同様にRecived Actionsのcopyとボタンを結び、Touch Up Insideイベントでアクションを送るように定義します。
すべて定義したときのConnectinsは以下のようになります。
すべてを保存し、実行メニューから「ビルドと実行」を選択すると、iPhone Simulatorが起動し、テキストフィールドを選択するとキーボードが表示されます。
copyボタンを押すとXCodeのコンソール画面には、
2010-09-18 18:56:06.300 CopyText[35867:207] copy method invoked
と出ます。
最後の画面は、一見上手くいっているように見えますが、TextFieldをタップするとキーボードが表示され、その後どうしても消えません。
そこで、困ったときのマニュアルです。CopyTextViewController.hのUITextFieldをオプション-ダブルクリックすると以下のような説明がでます。
&ref(): File not found: "description.png" at page "iPhone/最初の一歩";
この右上の本のアイコンを押すとUITextFieldのマニュアルが表示します。
Overviewを読んでいくと
とあり、UITextFieldDelegateプロトコルが入力の振る舞いをカスタマイズするメソッドを提供することが分かります。
UITextFieldDelegateのメソッドを見ていくとリターンボタンが押されたときの動作をカスタマイズするtextFieldShouldReturnが見つかります。
マニュアルには、textFieldShouldReturnの例題が無かったので、Googleで検索すると最初に以下のような用例が見つかります。
// テキストフィールドにフォーカスがあたっていて,入力が完了した時にキーボードを消すには, // UITextFieldDelegateプロトコルtextFieldShouldReturnメソッドを定義してあげればいい. - (BOOL)textFieldShouldReturn:(UITextField *)theTextField1 { [textField1 resignFirstResponder]; return YES; }
上記のtextFieldShouldReturnを追加した後、copyを以下のように変更します。
- (IBAction)copy { NSLog(@"copy method invoked"); toLabel.text = fromText.text; }
これで完成!と思いきや、copyボタンを押すとテキストがLabelにコピーされますが、キーボードが消えません。
そうです、textFieldのdelegateプロトコルを使っているの、textFieldのdelegateとしてFile's Ownerを結ぶ必要があったのです。
最終版の起動後、testと入力し、copyボタンを押した時のスナップショットです。
今回作成したプロジェクトのソースを以下にまとめました。
この記事は、
皆様のご意見、ご希望をお待ちしております。