Storyboardで起動時にNavigation Controllerのビューコントローラを構成する

Storyboardを利用している時に、起動時にNavigation Controllerの子ビューコントローラの構成を変更してみます。

まずStoryboardを以下のように作成します。
NewImage

Initial view controllerをUINavigationController、FirstViewControllerをUINavigationControllerに接続、SecondViewControllerを別個作成しています。
SecondViewControllerには以下のようにIdentifierにSecondViewControllerを指定しています。
Identifier

次にApplication Delegateの
– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
メソッドを以下のように記述します。

UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
UIViewController *secondViewController = [navigationController.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
[navigationController pushViewController:secondViewController animated:NO];
return YES;

StoryboardのInitial view controllerであるUINavigationControllerがwindowのrootViewControllerにセットされているので、それを取り出します。コントローラからStoryboardを取り出し、instantiateViewControllerWithIdentifierメソッドで指定したコントローラをインスタンス化します。上記コードではSecondViewControllerをインスタンス化しています。そのSecondViewControllerをUINavigationControllerにpushして、表示しています。

アプリを実行すると

second_view.png
このように、SecondViewControllerのビューが表示されます。

このようにinstantiateViewControllerWithIdentifierでインスタンス化することで、Segueで指定していないビューコントローラを利用することができます。

カスタムStoryboardセグウェイを作成する

Storyboardではカスタマイズしたセグウェイを利用することができます。

UINavigationControllerでフリップで画面を切り替えるセグウェイを作ってみます。

まず、UIStoryboardSegueを継承したFlipSegueクラスを作成します。
次に、FlipSegueクラスに以下のコードを追加します。

- (void)perform {
    UIViewController *sourceViewController = (UIViewController *)self.sourceViewController;
    UIViewController *destinationViewController = (UIViewController *)self.destinationViewController;
    [UIView transitionWithView:sourceViewController.navigationController.view
        duration:0.2
        options:UIViewAnimationOptionTransitionFlipFromLeft
        animations:^{
            [sourceViewController.navigationController pushViewController:destinationViewController animated:NO];
        }
        completion:nil];
}

ソースビューからデスティネーションビューにフリップアニメーションを行いつつ、Navigation Controllerでコントローラの切り替えをアニメーション無しで行っています。
そして、StoryboardでSegueをCustomに変更してFlipSegueを指定します。
NewImage