● Carbon視点でiPhone探求(2009/06/22)

  このニュースは、MOSAの会員にのみ配布されているデベロッパー向けの
  デジタルマガジンMOSADeNのに掲載された記事です。ほぼ一ヶ月遅れで
  ここに掲載されて行きます

 〜 ウィンドウの代役を用意する 〜


さて、取り込んだ画像をファイルへ保存し、そのパス名をモデルオブジェクトへ登録する準備が整いました。今回からは、UIViewController上に配置したUITableViewにそうした画像を一覧表示させる処理へと話を進めたいと思います。

ところで、アプリケーションの起動時と終了時に処理すべき事項として「環境設定」の読み込みと保存があります。これについては、実際に何らかの環境設定用パラメータが必要となった時点で解説したいと考えています。iPhone OSには、アプリケーションの環境設定をiPhoneの「設定」アプリで管理する方法もあるのですが、本アプリケーションではそちらの手法は使わない予定です。後は、加速度センサー(アクセロメータ)やCore Location(GPSによるデバイス位置の確認)のデリゲートメソッドの実装等もアプリケーション起動時に行うと良いのですが、こちらはiPhone 3.0で何か面白い動きがあるかもしれませんので、その正式登場まで待ちたいと思います(笑)。

iPhone用アプリケーションの開発には、AppKitをUIKitに差し替えたCocoa Frameworkを利用します。そこで採用されているGUI(グラフィカル・ユーザインターフェース)については、ビュー(UIView)やそのサブクラスであるコントロール(UIControl)を活用するなど、Mac OS Xのそれと多くの共通点がありますが、メニューが存在しないなど異なる点も幾つか見受けられます。また、UIKitにはAppKitには存在しない固有なクラスもあり、その有効活用こそがiPhoneアプリケーションの出来映えを左右すると言っても過言ではありません。そのしたクラスの代表選手が、UIViewControllerを始めとするビューコントローラです。

UIViewControllerは、その名の通りUIViewのコントローラとして働くためにUIKitに追加されています。UIViewControllerはUIResponderクラスを継承しており、自身が管理しているUIView上で発生した「マルチタッチ・イベント」を受け取り処理することが可能です。iPhoneアプリケーションでは、ある目的を実現するための作業単位を、ひとつのビューコントローラに結びつけて設計するのが普通です。ちなみに、Mac OS Xのアプリケーションにおける作業単位は、間違いなくウィンドウ(ダイアログやフローティングウィンドウも含む)です。

アプリケーションの目的を達成するには、新規ウィンドウをオープンし、そこにフォーカスを当てることでユーザの作業を促します。また、ウィンドウには目的に応じた色々なビューやコントロールが配置されることになります。iPhoneアプリケーションの場合には、AppKitのNSWindowとNSWindowControllerの組み合わせが、UIKitのUIViewとUIViewControllerに相当すると考えればよいでしょう。ちなみに、iPhoneでもウィンドウ(UIWndow)は存在しますが、こちらはUIViewのサブクラスであり(Mac OS Xの場合と異なる)スクリーン上にひとつだけ配置されます。こうした唯一のウィンドウはmakeKeyWindowメソッドでキーウィンドウ(Mac OS Xだとフロントウィンドウ)に指定され、ユーザからのタッチイベントを受け付け始めます。

まあ、複数のウィンドウを用意してもかまいませんが、通常のiPhoneアプリケーションでは代わりに複数のビューコントローラを用意します。UIViewControllerには、それ自身が管理するUIViewがひとつだけ付属しています。このUIViewがUIWindowのサブビューとなりスクリーン全面に表示されるわけです。つまり、ウィンドウを切り替えるのではなく、UIViewControllerとUIViewのペアを切り替えることにより、ユーザを目的の機能にフォーカスさせます。UIKitには、UIViewControllerのサブクラスとして機能が拡張された「UITableViewController」「UINavigationController」「UITabBarController」の3つのビューコントローラが用意されています。

・UIViewControllerとUITableViewController

UIViewControllerは一般的に使われるビューコントローラです。Xcodeの「View-Based Application」テンプレート(雛形)でプロジェクトを作成すると、MainWindow.xibにUIViewControllerのサブクラスが登録され、その機能を実装するためのソースコードが用意されています。UIViewControllerで使われるUIViewは、別のnibファイルに保存されており、それがアプリケーション起動時にスクリーン全体に表示されることになります。もう片方のUITableViewControllerは、リスト表示のためのUITableView(UIViewのサブクラス)をうまく管理できるよう機能拡張されています。

・UINavigationController

UINavigationControllerは、複数のビューコントローラを管理するためのスタックを保持しています。スタックに対しビューコントローラをプッシュやポップすることで、複数のUIViewControllerやUITableViewControllerを効率よく切り替えて使えます。Mac OS Xで言うなら、階層化されたウィンドウを目的に応じて切り替えながら作業を進めるタイプのアプリケーションと似ています。

UINavigationController |--- UITableViewController
             |--- UITableViewController
             |--- UIViewController
             |--- UIViewController

Xcodeの「Navigation-Based Application」テンプレートのMainWindow.xibには、ひとつのUINavigationControllerが登録されています。 UINavigationControllerの管理対象としてUIViewControllerのサブクラスであるRootViewControllerがひとつだけ用意されています。RootViewControllerはRootViewController.xibに用意されており、そのクラス自体はソースコードで実装されています。 ビューコントローラを追加することで、どんどん機能を拡張することが可能です。

・UITabBarController

UITabBarControllerを使うと、複数のUIViewControllerやUITableViewControllerを並列で管理できます。タブ切り替えで目的の機能を使えるようにするわけです。 Mac OS Xであれば、NSTabViewで対象ビューを切り替えるのと似ていますが、それよりもどちらかと言えば、多数のウィンドウを作業毎に切り替えて使う感じに近いかもしれません。

UITabBarController |--- UITableViewController
           |--- UIViewController
           |--- UINavigationController |--- UITableViewController
                         |--- UITableViewController
                         |--- UIViewController

Xcodeの「Tab Bar Application」テンプレートのMainWindow.xibには、タブ数が2に設定されたUITabBarControllerが登録されています。ひとつ目のタブをタップして表示される内容は、FirstViewControllerクラスとしてソースコードで実装されており、ふたつ目のタブで表示されるUIViewControllerの方は、SecondView.xibの方に用意されています。ユーザがタップ可能なタブ数を増やしていけば、さらに多くのビューコントローラを管理することが可能となります。

以前にも解説しましたが、Xcodeのプロジェクトをテンプレートから作る場合、適切なビューコントローラを活用するためには、目的に応じて「View-Based Application」か「Navigation-Based Application」か「Tab Bar Application」のどれかを選びます。どれを選択するかについては色々な要因があると思いますが、上記ビューコントローラの相関図を見ると、最も注目すべき要因はアプリケーションの規模(機能の複雑さ)なのかもしれません。

本アプリケーションは「Navigation-Based Application」テンプレートを使用しています。次回は、このテンプレートの内容を解説してから、UINavigationControllerが管理する(アプリでUIViewが最初に表示される)UITableViewControllerのサブクラス実装の話へと移りましょう。

copyright 2009 Ottimo, Inc. All rights reserved
無断転載・引用禁止