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が表示されれば終了です。お疲れさまでした。