iPhoneネイティブのクライアントを作る
フレームワークを効率良く利用するために
iPhone OSで稼働するアプリケーションは、いずれもある種の共通のユーザー・インタフェースを 持っていることはすぐに分かりますが、当然ながら、そうしたユーザー・インタフェースの仕組みをフレームワークとして提供しており、 それを利用するのが一番効率的な開発手段であるために使われています。 それらのクラスをきちんと使うことが、ユーザーインタフェース・ガイドラインに合致することにもつながります。
今回も、前回と同じサンプル・プログラムを使用します。 こちらからダウンロードしてください。
フレームワークの全貌まではこの記事では説明できませんが、ポイントをかいつまんで説明しましょう。 まず、実際に画面表示されるオブジェクトの基底クラスになる「ビュー」(クラス名はUIView)があり、 基本は長方形の表示領域です。色を付けたり、さらにはビューの中にビューを入れて表示させるという仕組みもあります。 このビューに対して、「ビューコントローラ」というオブジェクトを対応付けます。 UIViewに対してはUIViewControllerというクラスが定義されています。
ビューコントローラは、ビューに対する後ろ盾のような働きを行い、ビューの管理を行います。 例えば、ビューで発生するイベントは、ビューコントローラ側でのメソッド呼び出しで検知できます。 もちろん、UIViewやその派生クラスを基底クラスとして新たなクラスを作るということもできますが、 そこそこ複雑なプログラムでもUIViewを元にした新たなクラス定義はめったに見ません。 むしろ、ビューコントローラのサブクラスを定義し、そのサブクラスとビューを対応付けて稼働させるというのが iPhone OSの基本的なパターンと言えるでしょう。
ウインドウはUIViewのサブクラスであるUIWindowのインスタンスです。 シングル・タスクのアプリケーションですが、基本的には1つのウインドウのインスタンスを用意します。 それをベースに、コントローラをともなうさまざまなビューを置いて行きます。
これらをソースコードで生成することもできますが、iPhone OSの特徴は、 Interface Builderという開発ツールを利用して、オブジェクトのインスタンスをアイコンとして定義することです。 アプリケーション起動時にこのInterface Builderのファイル(XIBファイル)がロードされその定義に従ってインスタンス化が行われます。
Interface Builderでインスタンスを「つなぐ」
サンプル・プロジェクトにあるMainWindow.xibをInterface Builderで見ると、アイコンがいくつか見えます。 このファイルはアプリケーション起動時に自動的にロードされる設定になっています (ターゲットの項目の「情報」の「プロパティ」にある「主要Nibファイル」で設定)。
「App Delegate」と書かれたアイコンは、AppDelegateクラスのインスタンスで、 このクラスのソースはプロジェクトに入っています。つまり、プログラマが定義したクラスのインスタンスがあります。 iPhoneアプリケーションでは、アプリケーションそのもののインスタンスがありますが、 そのインスタンスで発生したイベント的なもの、例えばアプリケーションが起動したとかいった状況は 「デリゲート」という手法で、他のインスタンスでのメソッド処理に引き継がれます。 アプリケーションのデリゲート先が、このアプリケーションではAppDelegateクラスになっているということです。
Interface Builderの特徴は、インスタンス間を「つなぐ」ことができる点です。 つなぐことにより、あるインスタンスから別のインスタンスを参照できるようになります。 これを「アウトレット」と呼んでいますが。クラスでメンバ変数あるいはプロパティを定義して、 IBOutletというキーワードを付けておきます。すると、Interface Builderでその項目が増えます。 そして、ドラッグして、別のインスタンスに線をつなぎます。こうすると、XIBファイルをロードしたときに、 インスタンスへの参照を、アウトレットといて指定したメンバ変数に代入します。 XIBファイルで単にオブジェクトが生成されるだけでなく、生成されたオブジェクトが参照関係を持つまでを自動化しています。
前の図では、AppDelegateクラスのインスタンスのつながっている状況を示しています。 このクラスが、アプリケーション全体の司令塔的な役割を持ち、アプリケーションで使われるさまざまなインスタンスを参照するようにしています。 「RentalDB」は前の週に説明したデータをダウンロードするクラスのインスタンスです。