[iPhone SDK] View Based Application で NIB(XIB)ファイルを削除してみる

公開日: : iPhone, ,

iPhoneアプリ開発に慣れてくると、段々Interface Builderを使わなくなってくる。
Interface Builder との連携を完全に切ろうと思い、今回初めてView Based で作成したプロジェクトで NIB(XIB)ファイルを削除してみたらはまったのでメモしておく。

Stack Overflowでも、同じようにはまっている人がいた。(what is the difference between loadView and viewDidLoad?)

NIBファイルを削除すると、NIBファイルが生成してくれていた、UIWindowやUIViewControllerを自力で作らなければならなくなり、UIApplicationMain の変更も必要になる。
さらに、UIViewController はデフォルトではNIBファイルを読みにいってしまう(実際には、self.view に値がないとNIBファイルを探しに行くようだ) ので、それを避けるためにloadView でUIView を作成する必要がある。

参考にしたのは UIKit詳解リファレンスのP.21-P.27あたり。

UIKit詳解リファレンスは Window Based なプログラムを改造しているが、自分は View Based で作ったものを改造したので、loadViewのところではまってしまった。

具体的には、下記のステップの4,5が異なる。

  1. 「グループとファイル」から、.xib ファイルを全てDeleteキーで削除する
  2. info.plist から Main nib file base name を項目自体Deleteキーで削除する
  3. main.m のUIApplicationMain の第4引数の nil を アプリケーションデリゲートクラス名に変更する。
  4. アプリケーションデリゲートクラスの applicationDidFinishLaunchingXXX で、UIWindow と UIViewController を自力で作成する
  5. UIViewController クラスのloadViewで、self.view に UIView を自力で作成して入れる

手順をもう少し詳しく書いてみる。

View Based Application のテンプレートを使い、 NoXibTest という名前のプロジェクトを作成

「グループとファイル」から、MainWindow.xibとNoXibTest2ViewController.xibを削除

main.m の UIApplicationMain を下記のように変更

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

アプリケーションデリゲートクラスの applicationDidFinishLaunchingXXX で、UIWindow と UIViewController を自力で作成する

	
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    
    // Override point for customization after application launch.
	CGRect rect = [[UIScreen mainScreen]bounds];
	window = [[UIWindow alloc]initWithFrame:rect];
	viewController = [[[NoXibTestViewController alloc]init]autorelease];

    // Add the view controller's view to the window and display.
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];

    return YES;
}

UIViewController クラスのloadViewで、self.view に UIView を自力で作成して入れる

- (void)loadView {
	CGRect screenBounds = [[UIScreen mainScreen]bounds];		
	UIView *view = [[[UIView alloc]initWithFrame:screenBounds]autorelease];
	view.backgroundColor = [UIColor redColor]; // わかりやすいように赤背景にする
	self.view = view;	
}

うまくいかなかったらお知らせください。

関連記事

no image

Core Graphics と Quartz

Core Graphics と Quartz の関係がよく分からなかったので調べていたところ、ほぼ同

記事を読む

Linking 対応デバイス tomoru

この前 Makuake で出資しそこねた Tomoru が Amazon で ¥ 1,069 + ¥

記事を読む

大量のスクリーンショット取得作業を省力化する Sketch to AppStore vs LaunchKit

段々対応が必要な解像度が増えて、今は App Store にアプリSubmit時に4種類もスクリーン

記事を読む

heroku Cedar-10からCedar-14に引越し

2015/11/04 に Cedar-10 stack が終了となる連絡が heroku からきたの

記事を読む

no image

おんぷちゃん for iPad 1.3.3 Submit

今回は紅白歌合戦を見ながらSubmit。 相変わらずうちの娘が譜読みに苦労していて新しい曲を弾く

記事を読む

Apple Special Event 2012

2012年は下記が発表された。 iPhone 5iPod touchiPod nano

記事を読む

no image

最近読んだ本: エレガントなWeb開発・美しいコードCODA入門 2011/07/15

Coda がとても好きだ。 使っていて気分がいい。おそらく考え抜かれて作られたUIのためだろう。 自

記事を読む

no image

ツイッター 140文字が世界を変える コグレマサト+いしたにまさき

一度途中まで書いたのが手違いで消してしまった...のでもう一度。 一応Reviewplusさんからの

記事を読む

no image

iPhone 3G 起動せず

奥さんのiPhone 3G は年末あたりに一度充電できなくなったのだが、その後復活していた。 しかし

記事を読む

no image

[読んだ] 織田信長のマネー革命

織田信長のマネー革命 経済戦争としての戦国時代 (ソフトバンク新書)武田 知弘 ソフトバンククリエイ

記事を読む

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Apple Developer Program更新 2024

今年も更新した。 昨年はブログに記録し忘れたらしい。 今

ポモドーロテクニック用物理タイマーならTime Timer

会社ではなかなか自由に時間を使えないが、家で読書や作業をする

DELL 32インチディスプレイ U3223QE 購入

Dell U3223QE は解像度 3840x216

WWDC 2023 Vision Pro発表

2023/6/5 (日本時間 2023/06/06 2AM)のWWD

M1 MacBook Air を Venturaにアップデートする

M1 MacBook Air を macOS Montere

→もっと見る

PAGE TOP ↑