Maccle

[Obj-C]ストーリーボード, IBを使用せずにWindowとViewを表示してアプリを作成する方法

約 6 分
[Obj-C]ストーリーボード, IBを使用せずにWindowとViewを表示してアプリを作成する方法

withoutsb
Objective-C にて iOSアプリを作る際に、iOS4.1 までは初期ウインドウ(MainWindow.xib)が Interface Builder(IB) でデフォルトで作成されてたり、iOS4.2 からは メインストーリーボード(MainStoryboard.storyboard)が初期ウインドウとして最初に表示されるようになっています。

UIを作り込んでいくうちに、たくさんのビューを遷移したり、色々なUIオブジェクトを配置する上で、IBには限界があります。

それらを利用していた既存のアプリなんかは、iPhone 5の4インチディスプレイに対応させようとすると、この Xib やら storyboard のビューやオブジェクトの表示位置がめちゃくちゃになるなど、いい事がひとつもない

というわけで、これから Xcode でアプリを作る方は、ストーリーボードや Xib で UI を作り込むのはなるべくやめましょう。

ストーリーボードを使わずにアプリを作成する方法

1. MainStoryboard.storyboard を削除

プロジェクトのソースファイルから、MainStoryboard.storyboard を削除します。dontusestorybord

2. Main Storybord の指定を消去

プロジェクトのターゲットの “Deployment info” に指定されているメインストーリーボードの値を消去します。dontusestorybord2

3. main.m のmain関数を変更

main.m” の UIApplicationMain の第四引数が nil になっている場合は、アプリケーションのデリゲート(NSStringFromClass([AppDelegate class]))に変更。

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

4. ルートとなるビューコントローラを作成

メインウインドウに設定するビューコントローラを既存のプロジェクトに追加します。
※メインで使用する既存のビューコントローラがある場合はこの手順は不要。

ここでは「RootViewController」という名前のビューコントローラを作成してみます。

継承するサブクラスとして、UIViewController を指定します。dontusestorybord3

こんな感じ。dontusestorybord4

5. RootViewControllerをテスト用に弄る

RootViewController.m” の viewDidLoad を、テストのため例えば以下のように定義。
※メインで使用する既存のビューコントローラがある場合は以下を参考に書き換えてみてください。

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // ビューの背景色
    [self.view setBackgroundColor:[UIColor colorWithRed:0.5f green:1.0f blue:1.0f alpha:1]];
    
    // テスト用のラベル
    UILabel *label = [[UILabel alloc]
                      initWithFrame:CGRectMake(0, self.view.bounds.size.height/2 - 20,
                                                 self.view.bounds.size.width, 40)];
    ; 
    ; // 中央に表示
    
    // ラベル表示
    [self.view addSubview:label];
    
    // 破棄
    ;
}

6. AppDelegate.h にルートビューコントローラをインポート

アプリケーションのデリゲートのヘッダ(AppDelegate.h) に、ルートビューコントローラ(RootViewController.h)をインポート。

#import <UIKit/UIKit.h>
#import "RootViewController.h"

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) RootViewController *rootViewController;

@end

7. didFinishLaunchingWithOptions で Window と RootViewController を生成

AppDelegate.m” の didFinishLaunchingWithOptions を以下のように変更する。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // メインウインドウ
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    
    // フレームをデバイスのスクリーンサイズにセット
    self.window.frame = CGRectMake(0, 0, [[UIScreen mainScreen]bounds].size.width, [[UIScreen mainScreen]bounds].size.height-20);
    
    // ルートビューコントローラを生成
    _rootViewController= [[RootViewController alloc] init];
    
    // メインウインドウのrootViewControllerをセット
    self.window.rootViewController = _rootViewController;
    
    // レンダリング
    [self.window makeKeyAndVisible];
    
    return YES;
}

これでメインのストーリーボードはプロジェクトから排除され、ソース内でウインドウとルートビューコントローラを生成するようになりました。

実行結果

こんな画面が表示されればOK。capture 2013-02-27 17.23.54

About The Author

某IT系なんちゃってエンジニアヨーダ
Apple好きだけど盲目マカーは気持ち悪いと思ってる中道だと思い込んでるしがないダメダメエンジニア。

今もってるApple製品↓
Macbook Pro 15 inch, iMac 27 inch (Late 2009), iPhone 6 Plus, iPad (初代! いらない!)
Follow :

Leave A Reply

*

Comment On Facebook