Interface Builderを使わない最も基本的なiPhoneアプリ開発

iPhoneアプリを作りたい!と思ってMacとiPhoneと入門書を買った人は多いはず。
でも、Objective-Cという言語、iOS SDK(UIView? UIViewController??)という壁により、なかなか理解が進まない人が多いのではないでしょうか。

理解を阻害している原因の一つに、Interface Builderの存在があります。
XcodeにはInterface Builder(以下IB)というUIデザイン専用のアプリケーションが付属しています。
わけも分からずIBOutlet, IBActionを使ってる人も多いと思います。

確かにIBは便利なツールなのですが、入門→初級に上がるためにはIB抜きでのプログラミングを経験することが近道です。
今回はIB抜きで簡単なiPhoneアプリを作ってみることにします。

Xcodeのプロジェクトを新規作成する

プロジェクトの種類は”Window-based Application”にしましょう。
これは余計なものがついていない、最もシンプルなテンプレートです。
プロダクト名は”WithoutIB”としました。

IBとおさらばする

IBといえば、.xibファイル。
ということで削除しましょう。参照だけでなく本体も削除してしまっていいです。

次にプロジェクト設定を変更します。
以下の画面はXcode4のものなのでXcode3を使っている方は少し異なるかもしれませんが、基本的には同じです。

main.mを開きます。
(Xcode4の場合、Supporting Filesグループ内にあります)

// Before
int retVal = UIApplicationMain(argc, argv, nil, nil);
// After
int retVal = UIApplicationMain(argc, argv, nil, @"WithoutIBAppDelegate");

そろそろIBとおさらばできます。
このままだとIBOutletを使っている箇所がありますので、変更します。
WithoutIBAppDelegate.hを開き、以下のように変更します。

// Before
@property (nonatomic, retain) IBOutlet UIWindow *window;
// After
@property (nonatomic, retain) UIWindow *window;

アプリの土台をつくる

iPhoneアプリはここから始まります。
それはWithoutIBAppDelegate.mの

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    [self.window makeKeyAndVisible];
    return YES;
}

の部分です。ここにコードを書き加えます。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    [self.window makeKeyAndVisible];
    return YES;
}

1行だけ書き加えました。UIWindowというものを生成しましたが、これはすべてのUI(View)の土台になるもので、ここに貼りつけていくイメージをもつと良いです。
一つ注意すべきなのは、alloc->initで生成しているので自分でreleaseをしなければいけません。今回の場合はdeallocメソッドに解放が最初から書かれています。

[_window release];

土台にのせてみる

上で作ったUIWindowにUIを載せてみます。
UIWindowに直接UITextViewやUIImageViewを載せることはできませんしません。
UIWindowの上にはUIView(Controller)を載せます。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
   
    // ここから
    UIViewController *viewController = [[UIViewController alloc] init];
    [self.window addSubview:viewController.view];
    [viewController release];
    // ここまで追加

    [self.window makeKeyAndVisible];
    return YES;
}

UIWindowの上に載せるにはaddSubview:を使います。
(addSubviewをしたあとすぐにreleaseしているのは、addSubviewした時点でretainされているためです。メモリ管理については別記事にしてまとめたいと思います)

UIViewControllerというのが正しく機能しているのか確認するために、背景色を変えてみます。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
   
    UIViewController *viewController = [[UIViewController alloc] init];
    viewController.view.backgroundColor = [UIColor redColor]; // この行を追加
    [self.window addSubview:viewController.view];
    [viewController release];

    [self.window makeKeyAndVisible];
    return YES;
}

実行してみましょう。赤い画面が表示されたでしょうか。
つまらないアプリですが、これがどんなiPhoneアプリでも基本となっています。
次は少し複雑にしたプログラムを紹介してみましょう。