iPhoneアプリ作成までの道のり7

7. 画面遷移

ここまでで、iPhoneアプリ作成までの3つの試練はすべて乗り越えた。

  1. メモリ管理
  2. XcodeとStoryboardの扱い
  3. CocoaMVC
後は自分の作るアプリに必要なAPIを調べれば、時間と根気によってなんでも作ることができるだろう。何か問題があるとすれば、画面遷移の際のデータの受け渡し方法に悩むかもしれない。

Storyboardを使ったUI設計においては、画面遷移は主に2種類しかない。Push/Pop形式か、Modal形式のどちらかであり、NavigationControllerを使う場合は前者で、そうでない場合は後者だ。それとは別に、特殊な画面タイプであるTabBarControllerを使ったrelationというのもあるが、いずれにしても、Storyboardを使って設計する場合は、ViewController間*1の画面遷移はSegueを使って行うことになる。Segueとは、ただ単に画面遷移のアクションに名前(ID)を付けただけのものである。Segueにつける名前(ID)はStoryboard上で定義する。

例えば、"MySegue1"として定義した画面遷移を実行するには、

[self performSegueWithIdentifier:@"MySegue1" sender:self];

とすれば良い*2。ただこれだけのことである。そうすれば、後はStoryboard上での定義に従って、自動的に適切なViewControllerに制御が移るのである。画面遷移後のViewControllerで初期化が必要であれば、viewWillAppearをオーバーライドする。

さて、画面遷移というのは、ほとんどの場合において、データの引き継ぎを伴うものであろう。真っ当に設計されたUIであれば、すべての画面遷移において親子関係が生じている。突然なんの前触れもなく現れる単独のViewControllerというものは存在せず、Segueを実行するのが親であり、遷移先が子であるということだ。親から子へのデータ引き継ぎが必要な場合は、以下のように、画面遷移前のイベントで対応可能だ。

-(void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender {
    // セグエを判断する
    if ([segue.identifier isEqualToString:@"MySegue1"]) {
        // 次画面のビューコントローラーを取得する
        MyViewController* next = (MyViewController*)[segue destinationViewController];
		
        // 入力データをセットする
        next.input = self.xxx;
    }
}

このようにして、親から子へデータを渡せるということは、親子でデータの入れ物を共有することもできるし、必要であれば、親ViewControllerへの参照を子のViewControllerにセットすることができるということだ。即ち、子から親へのデータの受け渡しに関しては、いかようにもできるということである。

--

*1:言うまでもないだろうが、View-Controller間ではなく、ViewController-ViewController間の画面遷移である。

*2:言うまでもないだろうが、上記のselfは画面遷移前のViewControllerである。