読者です 読者をやめる 読者になる 読者になる

理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

Interface Builder なしに Hello World を表示する方法

3 冊ほど iOS 関連の書籍を読み終えたので、ようやく実際のコーディングに入ってみようかというところになりました。
最初に戸惑ったのが Interface Builder で、コイツは GUIGUI を組み立てると言えばいいのでしょうか、Drug&Drop でボタンの配置からイベントハンドラの指定までできてしまう優れたツールなんですけど、いかんせん裏側でどういう動作が行われているのかが分かりづらい。
また、いくつかソースが公開されている iOS アプリケーションも読んでみましたが、わりかし Interface Builder を使っていない (GUI 等も全てコードを書いて実現している) ものが多そうなので、じゃぁそっちで進めてみるかと思っています。

というわけで、表題通り Interface Builder を使わずに Hello World を表示する方法なのですが、具体的にはこの書籍に載っている方法と同じです。

iPhoneプログラミングUIKit詳解リファレンス

iPhoneプログラミングUIKit詳解リファレンス

結論から先に言えば、プロジェクトを作成したときに自動作成されるスケルトンの以下を変更すれば良いです。

  1. MainWindow.xib ファイルを削除
  2. (AppName)-info.plist から「Main nib file base name」のエントリを削除
  3. main.m で呼び出されている UIApplicationMain 関数の第四引数を nil から (AppName)AppDelegate に変更
  4. (AppName)AppDeletate.m

では、それぞれについての詳細です。

MainWindow.xib ファイルを削除

この xib ファイルこそが、Interface Builder 用の情報(例えばレイアウト情報)が入ったファイルです。Interface Builder は使わない方針なので、これはもはや使いません。消しましょう。

(AppName)-info.plist から「Main nib file base name」のエントリを削除

main.m を変更していない場合、アプリケーションはこの info.plist の当該エントリから Nib ファイルの名前を知り、それをロードしてインスタンス化します。Interface Builder は使わない方針なのでこれも不要な情報になります。

main.m で呼び出されている UIApplicationMain 関数の第四引数を nil から (AppName)AppDelegate に変更

UIApplicationMain の第四引数はアプリケーションの delegate となるクラス名*1を指定するフィールドです。初期状態では nil が指定されており、このときは Nib ファイルから delegate object がロードされます。しかし今回は Interface Builder は(ry
従って、今回は以下のように指定しました。

int main(int argc, char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, @"HelloWorldTestAppDelegate");
    [pool release];
    return retVal;
}

(AppName)AppDeletate.m

あとは、DelegateHello World を出力するコードを作成すれば良いです。初期化処理が終わったタイミングで呼び出される didFinishLaunchingWithOptions に、Window と Label を生成するコードを書けば完成です。Controller を介してないので、行儀は悪いですけど。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    CGRect rect = [[UIScreen mainScreen] bounds];
    self.window = [[UIWindow alloc] initWithFrame:rect];

    UILabel *label = [[UILabel alloc] initWithFrame:rect];
    label.text = @"Hello World!";
    label.textAlignment = UITextAlignmentCenter;
    [self.window addSubview:label];
    [label release];

    [self.window makeKeyAndVisible];
    return YES;
}

iOSシミュレータ
Uploaded with Skitch!

*1:クラス「名」なので、NSString* を渡す