今回から、XcodeとInterface Builderを利用したiPhoneアプリケーションの開発に取り組んでいきたいと思います。まずは、Xcodeで用意されているiPhoneアプリケーション用のテンプレート(雛形)プロジェクトを調べてみることにします。
iPhoneアプリケーションでは、ユーザの作業対象(表示の状態など)を変更する場合に、ウィンドウを切り替えるようなことはしません。代わりに「UIViewのみ」(Mac OS XであればNSView)もしくは「UIViewControllerとUIViewのペア」を切り替えて対応することになります。つまり、iPhoneではスクリーン上に表示されているウィンドウは常にひとつだけとなります(複数用意してもかまわないのですが...)。そういう意味では、Mac OS X用アプリケーションとは若干様子が異なります。
このようなiPhone独特の仕組みを念頭に置き、Xcodeが用意しているテンプレートの種類を確認してみます。Xcodeをアプリケーションから起動し、ファイルメニューから「新規プロジェクト...」を選択すると、テンプレートを選択するためのダイアログが表示されます。まず最初に、左側の対象OSとソフト種類から、iPhone OS直下の「Application」を選んでおきます。すると、右側に選択可能なテンプレート用アイコンが並びます(下に表示される説明は残念ながら英文のまま)。若干意味不明のアイコンもありますが(笑)こうしたテンプレートは、目的別に全部で6種類用意されています。
・Window-Based Application
「Window-Based Application」は、nibファイル(MainWindow.xib)に登録されているUIWindow(UIViewのサブクラス)に対して描画を実行するアプリケーションを作成します。UIWindow上にビューやコントロールを配置したり、そこへQuartz 2D APIでダイレクトに2D描画を実行することで、アプリケーション機能を実現します。Mac OS Xで例えると、モニターのスクリーン上に必要なGUIを設置して、すべての処理を完結させてしまうタイプのアプリケーションだと考えれば良いでしょう(例えばFront Rowなど)。このテンプレートが提供しているのが、一番簡単なiPhoneアプリケーションの構造です。
・OpenGL ES Application
「OpenGL ES Application」は、UIWindow(UIViewのサブクラス)上にひとつだけUIViewを配置し、それをEAGLViewクラスと定義してから、その内容をソースコードで実装します。そしてUIViewの幾つかのメソッドをオーバライドすることで、 EAGLView上にOpenGL APIによる3D描画ができる環境を形成します。Mac OS XのCocoaならば、スクリーンと同サイズのウィンドウをオープンし、その上にNSOpenGLViewを配置した状況だと考えてください。またCarbonであれば、スクリーン自体をOpenGL描画環境で「キャプチャ」した状態と同じです。これは、一般的な3Dゲームを開発するのに向いているテンプレートです(ところで何故アイコンは碁盤なのでしょうか?)。
・View-Based Application
「View-Based Application」では、 nibファイル(MainWindow.xib)にUIWindowとUIViewControllerが用意されています。そして、このUIViewControllerのサブクラスをソースコードを記述し実装します。また、UIViewControllerで使われるUIViewは別のnibファイルとして保存されており、アプリケーション起動時に、このUIViewがスクリーン全体に表示されます。前のふたつのテンプレートでは、UIWindowは単にUIViewを置く場所でしたが、UIViewControllerの方は、Cocoaのウィンドウと似た機能をアプリケーションに提供します。Mac OS X的に言えば、ダイアログやウィンドウをひとつだけオープンし、それですべての処理を完結させるタイプのアプリケーションを開発する時に使うと考えてください。そういう意味では、このテンプレートは「ViewController-Based Application」と呼んだ方が良いかもしれません。
・Utility Application
「Utility Application」では「View-Based Application」と同じように、nibファイル(MainWindow.xib)にUIWindowとUIViewController(RootViewController)を用意します。しかしView-Based Applicationの時とは異なり、RootViewController経由で操作するのは、MainViewControllerとFlipsideViewControllerの2つのUIViewControllerです。このふたつのクラスはソースコードで実装されます。それぞれのUIViewControllerに配置されるUIViewの方は、MainView.xibとFlipsideView.xibという二つのnibファイルに保存されています。このテンプレートでは、用意した2つのUIViewControllerをCore Animatiuonの機能を使い切り替えることが可能で、ダッシュボードの「Widget」をiPhone内に実現した感じとなります。 Mac OS X的に言えば、あるウィンドウから別ダイアログを表示して処理を続けるタイプのアプリケーションです。
・Navigation-Based Application
「Navigation-Based Application」は、 nibファイル(MainWindow.xib)にUIWindowとUINavigationControllerを用意します。UINavigationControllerはUIViewControllerを継承しており、複数のUIViewControllerを管理し、その表示を切り替える機能を利用できます。ここでは、管理対象としてUIViewController(RootViewController)がひとつだけ用意されていますが、テンプレートを拡張して複数のUIViewControllerを追加することが可能です。ちなみに、RootViewControllerクラス自体はソースコードで実装されています。 RootViewControllerで利用されるUIView(UITableView)は、別のnibファイルであるRootViewController.xibに用意されています。Mac OS X的に言えば、目的に応じて階層化された複数のウィンドウを切り替えることで作業を進めるタイプのアプリケーションだと考えれば良いでしょう。
・Tab Bar Application
「Tab BarApplication」では、 nibファイル(MainWindow.xib)にUIWindowと UITabBarControllerが用意されています。このUITabBarControllerのタブ数は2に設定されています。ひとつ目のタブをタップして表示される内容は、FirstViewControllerクラスとしてソースコードで実装されていますが、ふたつ目のタブのタップで表示される内容は、nibファイルのSecondView.xibに登録されているUIViewです。ユーザがタップ可能なタブの数を増やせば、さらに多くのUIViewControllerやUINavigationControllerを管理することが可能です。 機能的にはウィンドウ上に配置したタブコントロールに似ているのですが、 Mac OS X的に言えば、 多数のウィンドウを切り替えて作業を行う大規模なアプリケーション向けのテンプレートです。
上記のアイコンのうちのひとつを選んで下の「選択...」ボタンを押してからプロジェクト名を入力すると、保存先に必要なファイル(Objective-Cソースファイルやnibファイルなど)をすべてまとめたプロジェクト用フォルダが作成されます。この時のプロジェクト名にはなるべく日本語を使わないでください(使おうと思えば使えますが...)。出来る限り開発アプリケーションの「名称」そのものにしておくと、後で煩わしい変更作業が必要なくなります。
開発の第一歩は、自作アプリケーションの機能や構成に向いたテンプレートを選択することです。よって、Xcodeがどんなテンプレートを「はき出す」のかを熟知していることは大変重要です。例えば「App Store」で販売されているiPhoneアプリケーションが、どのテンプレートから開発されているのかを推測するのも勉強になります。現状では、ゲームやパズルが多いので、ほとんどは「Window-Based Application」や「OpenGL ES Application」のような気がしますが(笑)。
さて、iPhone用の「しんぶんし」の開発には、どのテンプレートを使いましょうか?とりあえず「Navigation-Based Application」が向いているような気もしますが、その結論は宿題として次回まで取っておくことにしましょう。