[iPhone SDK] View Based Application で NIB(XIB)ファイルを削除してみる
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が異なる。
- 「グループとファイル」から、.xib ファイルを全てDeleteキーで削除する
- info.plist から Main nib file base name を項目自体Deleteキーで削除する
- main.m のUIApplicationMain の第4引数の nil を アプリケーションデリゲートクラス名に変更する。
- アプリケーションデリゲートクラスの applicationDidFinishLaunchingXXX で、UIWindow と UIViewController を自力で作成する
- 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;
}
うまくいかなかったらお知らせください。
関連記事
-
-
リズムくんにくまモン画像を利用させていただきました
熊本県さまから許諾をいただけたので、リズムくん バージョン1.6で、くまモン画像を表示
-
-
[iOS9] jQuery Mobile のBackボタンが動作しない
自作アプリ EverLearn や Reibun でヘルプファイルの表示用にローカルに保存した jQ
-
-
iPhoneアプリネットワーク+GPSプログラミング 橋本佳幸
去年12月に読んで、途中まで感想を書いてそのままにしていた。ネットワーク関連の実用的なコードが多くて
-
-
[iPhone開発本] iPhoneではじめるOpenGL ESプログラミング
2010/07/13(火)発売。昨日書店で立ち読みしてみたら良さそうな本だった。 パンカクの本も良か
-
-
App Store にPreview動画をアップロードしてみた
現在新アプリの公開準備を進めているが、今回のアプリの使い方を知ってもらうには動画を見てもらうのが一番
-
-
iPhone SDK 3.0 beta 4
iPhone プログラミング記さんによると、 iPhone SDK 3.0 beta 4 になってよ
-
-
Apple Event 2016秋 See you on the 7th
2016秋のApple Eventは 2016/09/07(日本時間 9/8 2:00)に行われた。
-
-
[iPhone SDK] GPX Format で位置情報を出力
今公開している Log Locations は割り切りでエクスポート機能を入れていなかったのだけれど
-
-
Admob に関して少し調べてみた
iPhoneアプリとAndroidアプリでAdmobを使って広告を表示してみているが、いまだに管理画
-
-
自作アプリ おんぷちゃん にランキングモードを追加
かなり前からほそぼそと準備を続けていた、五線譜学習アプリ おんぷちゃんへのランキング挑戦モード追加