iPhoneアプリ作成までの道のり7
7. 画面遷移
ここまでで、iPhoneアプリ作成までの3つの試練はすべて乗り越えた。
後は自分の作るアプリに必要な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にセットすることができるということだ。即ち、子から親へのデータの受け渡しに関しては、いかようにもできるということである。
--