Edited at

Segueでは表現できない遷移をする

More than 5 years have passed since last update.

スクリーンショット 2014-01-22 8.48.23 2.png

通常Viewが A -> B と積まれていた状態で A -> C -> D することはStoryboard上で表現することはできない。そのような遷移のサンプルです。

まず、何らかのアクションに対して、遷移用のクラスにメッセージを送ります。特殊な遷移に対しては、ひとつのクラスにまとめるのが良いと思います。そのような遷移は、複数のViewControllerから行われるのが多いためです。(設定へ遷移するとか。)ここでは、MainEntryはシングルトンで実装されていますが、必ずしもその必要はありません。Storyboardの読み込みが時間がかかる場合があるため、ここではシングルトンを使っています。

- (IBAction)touchtToD:(id)sender {

[[MainEntry sharedEntry] moveToD:self.navigationController];
}

次に、Storyboard IDを設定します。Storyboard IDを設定することによって、コードからIDを指定してVIewControllerを取り出すことができるようになります。ここでは、"C"と"D"を指定しています

beyondSegue_2.png

最後に、実際の遷移です。popとpushを使って任意の状態に持っていきます。重要なのは最後のアニメーション以外をNOにすることです。途中でYESになっている場合、そこまでしか遷移がされません。

- (void)loadStoryboard {

_storyboard = [UIStoryboard storyboardWithName:[self storyboardName] bundle:nil];
}

- (id)viewController:(NSString *)identifier {
return [_storyboard instantiateViewControllerWithIdentifier:identifier];
}

- (void)moveToD:(UINavigationController *)controller {
[controller popToRootViewControllerAnimated:NO]; // 全てのスタックを捨てる
[controller pushViewController:[self viewController:@"C"] animated:NO]; // Cを積む
[controller pushViewController:[self viewController:@"D"] animated:YES]; // Dを積む 最後だけアニメーションをかける
}

これでSegueを使わない遷移が出来ました。


サンプルコード

https://github.com/akuraru/QiitaTest


参考

Storyboardで定義したViewControllerを呼び出す

Storyboardに移行するサンプル - 導入編

Storyboard使用時でも、コードで画面を切り替える方法