※iOS5以上での方法となります。
storyboard
まずstoryboardで起動元画面を1画面、ModalView用の2画面作成します。左から以下の名前で進めていきます。
- ViewController
- ModalView1Controller
- ModalView2Controller
ModalView1Controller
1つ目のModalViewを実装していきます。以下は ModalView1Controller.h
@protocol ModalView1ControllerDelegate - (void)switchModalViewController:(UIViewController *)controller; @end @interface ModalView1Controller : UIViewController { id<ModalView1ControllerDelegate> myDelegate; } @property (nonatomic, retain) id myDelegate; - (IBAction)showModalView2Controller:(id)sender; // storyboardに配置しているボタンのイベント @end
次に ModalView1Controller.m
// 遷移するトリガー。ここではボタンクリックにしています - (IBAction)showModalView2Controller:(id)sender { UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil]; // MainStoryboard_iPhone.storyboard UINavigationController *nc = [storyboard instantiateViewControllerWithIdentifier:@"Modal2ViewController"]; // StoryboardIDを指定 [myDelegate switchModalViewController:nc]; }ここではDelegateを使って、遷移元に次に表示したいModalViewのControllerを渡している点がポイントです。
ViewController
次に1つ目の画面であるModalView起動画面を実装します。以下は ViewController.m
// 遷移直前に呼ばれる - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { ModalViewController *controller = segue.destinationViewController; controller.myDelegate = self; // 上記はViewControllerに対して行う処理。Navigationとかは以下みたいにする // UINavigationController *navigationController = segue.destinationViewController; // MangaPageViewController *controller = (id)[[navigationController viewControllers] objectAtIndex:0]; } #pragma mark - ModalView1ControllerDelegate - (void)switchModalViewController:(UIViewController *)controller { // 遷移先のModalViewを閉じて、次に表示させたいModalViewを起動 [self dismissViewControllerAnimated:YES completion:^{ [self presentViewController:controller animated:YES completion:NULL]; }]; }ポイント2つ。
- 遷移する時にModalView1Controllerで実装してるmyDelegateにselfを設定しておく。
- delegateメソッドが呼ばれたら表示中のModalView1Controllerを閉じ、閉じる処理が完了したらModalView2Controllerを起動させる。
ios4で実装する方法もあるみたい。
返信削除http://codereview.stackexchange.com/questions/8924/ios4-alternatives-for-dismissviewcontrolleranimatedcompletion
いつまでサポートすべきかわからないけどね (・ω・ ;)(; ・ω・)