iPhoneでIB使わないでHelloWorldする手順まとめ
久しぶりにxCodeを使おうとするといろいろ忘れてしまっていたので備忘録を記します。
試した環境
% sw_vers ProductName: Mac OS X ProductVersion: 10.6.7 BuildVersion: 10J869
xCodeのバージョンは3.2.6 xCode4は有料なのでまだ躊躇しているっていう。
Developer Information: バージョン: 3.2 (10M2518) 場所: /Developer アプリケーション: Xcode: 3.2.6 (1761) Interface Builder: 3.2.6 (851) Instruments: 2.7 (3017) Dashcode: 3.0.2 (333) SDK: Mac OS X: 10.5: (9L31a) 10.6: (10M2518) iPhone OS: 4.3: (8F190) iPhone シミュレータ: 3.2: (7W367a) 4.0: (8A400) 4.1: (8B117) 4.2: (8C134) 4.3: (8F190)
IB使わないでHelloWorld
新規プロジェクトでview-based Applicationを作成します。
私は~/project以下で作業する習慣があるのでそこにHelloWorldというプロジェクトを作成しました。
最初は以下のようなディレクトリ構成になっています。
% ls ~/project/HelloWorld Classes HelloWorld_Prefix.pch HelloWorld-Info.plist MainWindow.xib HelloWorld.xcodeproj build HelloWorldViewController.xib main.m
xibファイルを削除
xibフィアルはInterface Builderのデータファイルですが、私はIBを使わないでiPhoneアプリを開発したいです。
よってこのファイルを削除します。
MainWindow.xibとHelloWorldViewController.xibを削除してください。以下、作業後のディレクトリです。
% ls ~/project/HelloWorld Classes HelloWorld.xcodeproj build HelloWorld-Info.plist HelloWorld_Prefix.pch main.m
試しにこの状態でビルドと実行を行ってみます。この状態だとエラーになるはずです。
コンソールに理由が表示されているので確認できます。
reason: 'Could not load NIB in bundle: ...
xibファイルを使う宣言を取り消す
HelloWorld-Info.plistを開いて一番下にあるMain nib file base nameの行を削除します。
xibファイルが行っていた事を代行する
次のmain.mの次の行を書き換えます。
int retVal = UIApplicationMain(argc, argv, nil, nil);
次のようにします。
int retVal = UIApplicationMain(argc, argv, nil, @"HelloWorldAppDelegate");
xibファイルが適切なDelegateクラスを取得してくれていたのですが、そのxibファイルがなくなっているため自分で適切なDelegateクラスを指定する必要があるからです。
HelloWorldAppDelegate.hを書き換える
#import <UIKit/UIKit.h> @class HelloWorldViewController; @interface HelloWorldAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; HelloWorldViewController *viewController; } @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet HelloWorldViewController *viewController; @end
次のように書き換えます。
#import <UIKit/UIKit.h> @class HelloWorldViewController; @interface HelloWorldAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *_window; HelloWorldViewController *_viewController; } @end
HelloWorldAppDelegate.mを書き換える
#import "HelloWorldAppDelegate.h" #import "HelloWorldViewController.h" @implementation HelloWorldAppDelegate @synthesize window; @synthesize viewController; #pragma mark - #pragma mark Application lifecycle - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. // Set the view controller as the window's root view controller and display. self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; return YES; } (中略) - (void)dealloc { [viewController release]; [window release]; [super dealloc]; }
次のように書き換えます。
#import "HelloWorldAppDelegate.h" #import "HelloWorldViewController.h" @implementation HelloWorldAppDelegate #pragma mark - #pragma mark Application lifecycle - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { HelloWorldViewController * helloWorldViewController = [[HelloWorldViewController alloc] init]; CGRect frameForWindow = [[UIScreen mainScreen] bounds]; _window = [[UIWindow alloc] initWithFrame:frameForWindow]; [_window makeKeyAndVisible]; [_window addSubview:helloWorldViewController.view]; return YES; } (中略) - (void)dealloc { [_window release]; [super dealloc]; }
helloWorldViewController.mを書き換える
コメントアウトされている箇所を書き換えます。
/* // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; } */
次のようにします。
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; UILabel * label = [[UILabel alloc] initWithFrame:self.view.bounds]; label.text = @"Hello, world!"; label.textAlignment = UITextAlignmentCenter; label.backgroundColor = [UIColor whiteColor]; label.textColor = [UIColor blackColor]; label.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.view addSubview:label]; [label release]; }
画面にHelloWorldが表示されれば終了です。お疲れさまでした。