新規プロジェクトの種類

2010/06/28

ようやく参考本の購読が300/600ページになりました(約1ヶ月・・・) でも、何気なく気に飛ばしていた「基礎の基礎」が抜けていたり(^^;) いや、この「基礎の基礎が」奥が深くて大変なんですよね。 という訳で、この辺で一旦スタートに戻ってちょっとだけかじってみます。

新規プロジェクトの種類

新規プロジェクトの種類は、プロジェクト作成時に対象のファイルを自動作成してくれます。 (逆に言えば、別に使わなくてもしこしこ書けるわけですが) 「作成されるテンプレートファイルが違う」事だけはわかっていても、具体的には把握していなかったり。 Carbon視点でiPhone探求を抜粋しました。

■Window-Based Application

「Window-Based Application」は、nibファイル(MainWindow.xib)に登録されているUIWindow (UIViewのサブクラス)に対して描画を実行するアプリケーションを作成します。 UIWindow上にビューやコントロールを配置したり、そこへQuartz 2D APIでダイレクトに2D描画を実行する ことで、アプリケーション機能を実現します。Mac OS Xで例えると、モニターのスクリーン上に必要なGUI を設置して、すべての処理を完結させてしまうタイプのアプリケーションだと考えれば良いでしょう (例えばFront Rowなど)。 このテンプレートが提供しているのが、一番簡単なiPhoneアプリケーションの構造です。

もっとも基本的なファイル構成。 iphone (1) AppDelegateについて

#import <UIKit/UIKit.h>
@interface WindowBaseAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@end

まずNSObjectについてApple Developper クラスによると、

Foundation フレームワークをベースにしたコードを書いている場合、そのルートクラスは一般的に NSObject です。 つまりは、実質最上位のオブジェクトとして考えればよいかと。

UIApplicationDelegateは、UIApplicationオブジェクトのデリゲートプロトコルです。

@protocol UIApplicationDelegate<NSObject>

ちなみに@protocolと@interfaceの違いは以下の通り - @protocolで要件宣 - @interfaceで採用宣言

UIApplicationのUIApplicationDelegateには、iPhoneが一連のアプリケーション動作をするために必要なメソッドが定義されています。

- (void)applicationDidFinishLaunching:(UIApplication *)application;
- (BOOL)application:(UIApplication *)application
 didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)applicationDidBecomeActive:(UIApplication *)application;
- (void)applicationWillResignActive:(UIApplication *)application;
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;
- (void)applicationWillTerminate:(UIApplication *)application;
- (void)applicationSignificantTimeChange:(UIApplication *)application;
- (void)application:(UIApplication *)application
 willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation
 duration:(NSTimeInterval)duration;
- (void)application:(UIApplication *)application
 didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation;
- (void)application:(UIApplication *)application
 willChangeStatusBarFrame:(CGRect)newStatusBarFrame;
- (void)application:(UIApplication *)application
 didChangeStatusBarFrame:(CGRect)oldStatusBarFrame;
// one of these will be called after calling -registerForRemoteNotifications
- (void)application:(UIApplication *)application
 didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
 __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)application:(UIApplication *)application
 didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
 __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)application:(UIApplication *)application
 didReceiveRemoteNotification:(NSDictionary *)userInfo
 __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)application:(UIApplication *)application
 didReceiveLocalNotification:(UILocalNotification *)
 notification __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0);
- (void)applicationDidEnterBackground:(UIApplication *)
 application __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0);
- (void)applicationWillEnterForeground:(UIApplication *)
 application __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0);
- (void)applicationProtectedDataWillBecomeUnavailable:(UIApplication *)
 application __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0);
- (void)applicationProtectedDataDidBecomeAvailable:(UIApplication *)
 application    __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0);

英訳すればそのままなんだろうけど、僕には全部覚える脳味噌はありません・・・ 日が暮れるというより人生が終わってしまいそうw まぁ、変更するケースになった時に覚えばいいのですが、なぜこのUIApplicationを継承するかは知っておく必要はありますね。 ちなみに、iPhone SDK4を入れたので、iPhone3用とiPhone4用で異なったメソッドがありますね。

(2)MainWindow.xib Window-Based Applicationでは、MainWindow.xibが自動作成されます。 ソースで言うと、IBOutlet UIWindow *windowとMainWindow.xibのWindowが既にアウトレットとして設定されています。 xib

(3)WindowBase-Info.plist plist Localizationやiconなどアプリケーション設定をします。 XMLファイルですが、独立したEditorで編集できます。

さて、次はフレームワークについて Apple Developper iPhone OSのフレームワーク

(4)UIKitフレームワーク Apple Developper iPhone OSテクノロジー

iPhone OS上のアプリケーションはすべてこのフレームワークを使用して、核となる以下の機能セットを実装します。

つまりは、iPhoneでUIを担当するフレームワークなので必須です。

MacOSXのアプリケーション開発メインフレームワークはCocoaで、UIを担当するApp Kitです。 iPhoneでは、AppKitの代わりにUIKitが採用されています。

(5)Foundationフレームワーク

Core Foundationフレームワーク(「Core Foundation」を参照)内の多くの機能へのObjective-Cの ラッパーを提供します。Foundationフレームワークは、以下の機能をサポートします。

-コレクションデータ型(配列、集合など) -バンドル -文字列管理 -日付と時刻の管理 -未加工データブロック管理 -環境設定管理 -URLおよびストリーム操作 -スレッドおよび実行ループ -Bonjour -通信ポート管理 -国際化

(6)CoreGraphicsフレームワーク Quartz 2D用のインターフェイスが含まれています。 ※Wikipedia Quart

■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」と呼んだ方が良いかもしれ ません。

iphone WindowBaseアプリケーションをベースに以下のViewController系のファイルが追加されます。 -ViewController.h (UIViewControllerを継承) -ViewController.m -ViewController.xib

これも基本的なプロジェクトですね。 -MainWindow.xib iphone AppDeglegateのアウトレット iphone ViewControllerのアウトレット iphone

■OpenGL ES Application

「OpenGL ES Application」は、UIWindow(UIViewのサブクラス)上にひとつだけUIViewを配置し、 それをEAGLViewクラスと定義してから、その内容をソースコードで実装します。そしてUIViewの幾つかの メソッドをオーバライドすることで、 EAGLView上にOpenGL APIによる3D描画ができる環境を形成します。 Mac OS XのCocoaならば、スクリーンと同サイズのウィンドウをオープンし、その上にNSOpenGLViewを配置 した状況だと考えてください。また Carbonであれば、スクリーン自体をOpenGL描画環境で「キャプチャ」 した状態と同じです。これは、一般的な3Dゲームを開発するのに向いているテンプレートです (ところで何故アイコンは碁盤なのでしょうか?)。

iphone 一気にファイルが増えました。 ちと、3Dゲーム系はノータッチなので、OpenGL開発が出てきた時に追記します。

■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的に言えば、あるウィンドウから別ダイアログを表示して処理を続けるタイプのアプリケーションで す。

ViewBase Applicationに、FlipsideView系のファイルが追加されます。 デフォルトだとメインウィンドウのインフォボタンをクリックすると、Flipside.xibでレイアウトしたウィンドウが回転して開きます。 iphone

#import 
@protocol FlipsideViewControllerDelegate;
@interface FlipsideViewController : UIViewController {
    id <FlipsideViewControllerDelegate> delegate;
}
@property (nonatomic, assign) id <FlipsideViewControllerDelegate> delegate;
- (IBAction)done:(id)sender;
@end
@protocol FlipsideViewControllerDelegate
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller;
@end
id  delegate

の構文がなんか気持ち悪い・・・。 あと、なぜFlipsideViewControllerDelegateで2回プロトコルしてるのだろう???(謎)

-MainWindow.xib iphone MainViewControllerのアウトレット iphone AppDelegateのアウトレット iphone

■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的に言えば、目的に応じて階層化された複数のウィンドウを切り替えることで作業を進めるタイプ のアプリケーションだと考えれば良いでしょう。

ナビゲーションでViewを階層化して表現するアプリに適してます。 ナビゲーション第一階層としてRootViewController系のファイルが作成されています。 iphone

#import <UIKit/UIKit.h>
@interface NavigationAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    UINavigationController *navigationController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
@end

-MainWindow.xib iphone NavigationControllerのアウトレット iphone AppDelegateのアウトレット iphone NavigationControllerはRootViewControllerから読み込まれています。 iphone

-RootViewController.xib iphone TableViewがUIViewとして設定されています。 iphone File's Ownerのアウトレット iphone

■Tab Bar Application

「Tab BarApplication」では、 nibファイル(MainWindow.xib)にUIWindowと UITabBarControllerが用意 されています。 このUITabBarControllerのタブ数は2に設定されています。 ひとつ目のタブをタップして表示される内容は、FirstViewControllerクラスとしてソースコードで実装されて いますが、ふたつ目のタブのタップで表示される内容は、nibファイルのSecondView.xibに登録されている UIViewです。 ユーザがタップ可能なタブの数を増やせば、さらに多くの UIViewControllerやUINavigationControllerを管理 することが可能です。 機能的にはウィンドウ上に配置したタブコントロールに似ているのですが、 Mac OS X的に言えば、 多数のウィンドウを切り替えて作業を行う大規模なアプリケーション向けのテンプレートです。

文字通りTabBarナビゲーションを利用して画面を切り替えます。 iphone

デフォルトでは、FirstViewController、SecondViewController系のファイルが作成されています。 これらViewの管理は、AppDelegateファイルが管理しています。

#import <UIKit/UIKit.h>
@interface TabBarAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> {
    UIWindow *window;
    UITabBarController *tabBarController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@end

TabBarを利用するのでUITabBarControllerDelegateを継承しています。

FirstViewController、SecondViewControllerのViewはMainWindow.xibのUITabBarで設定(NibName)しています。 iphone

Tab Bar Applicationの作成方法はマルチビュー参照 ※プロジェクトはWindow-Based Applicationをベースに作成