Interface Builderを使わずにUIViewを記述する方法

参考:「iPhoneプログラミング UIKit詳解リファレンス」 リックテレコム P.21-27
http://token.sakura.ne.jp/wp/

上記参考書籍、大変参考になりますが、nibファイルをすべて削除したときのUIViewControllerのviewの取り扱いについては詳しく書かれてませんでした。AppDelegate内で、windowに直接viewを追加する方法しか書いてないんですね。。

IBを使った場合は、MainWindow.xib内で指定したUIViewControllerに自動でviewが追加されますね。なので、nibを削除してしまった場合は、AppDelegate内でUIVIewControllerを記述してやらないといけないんですね。View-based Applicationを選択してHogeという名でプロジェクトを作成した場合を例に手順を追って説明します。


手順1:nibファイル(MainWindow.xibとHogeViewController.xib)を消去
まずは不要なnibをすべて消去します。


手順2:Hoge-Info.plistを編集
Hoge-Info.plistを開いて、Main nib file base nameと書いてある行を削除。この行で指定しているのは、maim.mが実行されたときに読み込まれるnibの名前なのでここで削除してしまいます。


手順2:main.mのコードを編集

    int retVal = UIApplicationMain(argc, argv, nil, nil);

通常4つめの引数はこのようにnilで、この引数はデリゲートの名称を指定するためのものです。nibがある場合はデリゲートの指定はnibが行なうのでnilとなってますが、nibを削除しているのでデリゲートの名称を明示してやらなくてはなりません。ということでここにデリゲートの名称を記入します。

    int retVal = UIApplicationMain(argc, argv, nil, @"HogeAppDelegate");


手順4:HogeAppDelegate.mにコードを追加

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
	window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; //nibの代わりにwindowを作成
	viewController = [[HogeViewController alloc] init]; //nibの代わりにviewControllerを作成
	
    // Add the view controller's view to the window and display.
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];

    return YES;
}

// Override point〜以下2行を追加してます。
つまり、ここでnibに代わってwindowとviewControllerを作成してるんです。でもこれだけじゃだめなんですね。


手順5:HogeViewController.mにコードを追加

// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
	CGRect screenBounds = [[UIScreen mainScreen] bounds];
	UIView *rootView = [[UIView alloc] initWithFrame:screenBounds];
	rootView.backgroundColor = [UIColor redColor]; //わかりやすいように赤背景にする
	self.view = rootView;
	[rootView release];
}

コメントアウトされているloadViewメソッドの中にコードを追加。コメント行に英文で記述してあるように、コードで直接viewを記述するのがこのメソッドの役目のようです。このメソッド、参考サイトの記述によると、nibからviewがロードできなかった場合に読み込まれるようですね。nibは上記コードの代わりに自動でviewを作成してくれていたのです。今回は参考までに赤い背景色のviewを追加しただけですが、実用的なviewを作成するためには、別にUIViewのサブクラスを作成して、それをここで読み込んでやるのがいいでしょう。

あと、IBOutletの指定が必要なくなったので、HogeAppDelegate.hの@propety以下と、HogeAppDelegate.mの@synthesize以下のアクセサメソッド定義部分は必要なくなります。ついでにこいつも消去しちゃいましょう〜。