2013年1月23日水曜日

2つのModalViewを切り替えて表示する方法

ModalViewを起動している時に、一度ModalViewを閉じてすぐに他のModalViewを起動したい事があるかと思います。今回はその方法を書きます。
※iOS5以上での方法となります。

storyboard

まずstoryboardで起動元画面を1画面、ModalView用の2画面作成します。
左から以下の名前で進めていきます。
  • ViewController
  • ModalView1Controller
  • ModalView2Controller
ModalView2ControllerのStoryboardIDに「Modal2ViewController」と設定しておきます。

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つ。
  1. 遷移する時にModalView1Controllerで実装してるmyDelegateにselfを設定しておく。
  2. delegateメソッドが呼ばれたら表示中のModalView1Controllerを閉じ、閉じる処理が完了したらModalView2Controllerを起動させる。

完成

実装は終わりましたので確認してみてください。

1 件のコメント:

  1. ios4で実装する方法もあるみたい。
    http://codereview.stackexchange.com/questions/8924/ios4-alternatives-for-dismissviewcontrolleranimatedcompletion
    いつまでサポートすべきかわからないけどね (・ω・ ;)(; ・ω・)

    返信削除