[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; }
うまくいかなかったらお知らせください。
関連記事
-
iOS9から[NSLocale preferredLanguages] の出力が変更された
以前ツイートした内容を自分で忘れていて検索する羽目になったのでブログにも書いておく。iOS9から、
-
ピーターの法則 ローレンス・J・ピーター
図書館で予約して借りてみた本。 「階層社会では、すべての人は昇進を重ね、おのおのの無能レベルに到達す
-
Xcode 設定しておくと便利なカスタマイズいろいろ
以前から Xcode はもう一歩使いにくいと思っていたが、iPhone アプリで稼げるのか でカスタ
-
Reject 履歴 おんぷちゃん 1.9.0
久しぶりに おんぷちゃん をアップデートしようとしたところ、"Guideline 2.3.7 - P
-
[iPhone 開発関連本] SQLite入門 第2版 西沢直木
SQLite はそれなりにクセがあるらしく、今までに入手した知識とFMDBのソースコードだけ(FMD
-
Application tried to present a nil modal view controller on target 問題
MFMailComposeViewController を使ってメール送信ダイアログを表示しようとし
-
Pastebot が OSX 用になっていた
昔使っていたがいつの間にか使わなくなっていた Pastebot が、いつの頃からかiOS版がなくなり
-
確かにきれいに貼れる パワーサポート アンチグレアフィルムセット for iPhone 4 PHK-02
会社の知り合いがiPhone 3GSに貼っていた保護シートがえらくきれいに貼れているのでメーカーを確
-
iPhoneゲーム開発ワークショップ 翔泳社 PJ Cabrera
以前紹介した、iPhone Games Projects の翻訳本「iPhoneゲーム開発ワークショ
-
Steve Jobs 公認伝記 Kindle 版を買ってみた
2011年10月5日(水)に56歳でなくなった Steve Jobsの公認伝記。 ずいぶん前か