unwind Segueについて

Xcode4.5からunwind segueが追加されました。
公式のAdopting Storyboards in Your Appを参照してもらいたい。

https://developer.apple.com/videos/wwdc/2012/

1.はじめに
iOS6以降でないと機能しません。使われているViewControllerから遷移しようとすると、エラーを出して止まります。

2.何ができるのか
戻るためのStoryboard上で見えないSegueを設定することができる。
iOSで戻る遷移をどう記述するかは一つの問題だった。今までは、Storyboard上でStyleにCustomしてSegue Classを設定するか、コードに埋め込むかだった。前者はSegueだらけになるし、後者はどこで記述されているかわからなくなる。
unwind segueが追加されたことによって、ゴチャゴチャにならずにStoryboardですべての遷移を設定できるようになった。

3.どう使うのか
例を作ったので参照して欲しい。

https://github.com/akuraru/unwindSegue

  • 戻る先のViewController.mにunwind Segue用の関数を追加する。
  • 今までのSegueをつなげるようにExitにcontrol + ドラック
  • unwind Segueを選択する。

unwind segue用の関数には、ただ戻るだけならば何も書かねくてもいい。ここで書けることは戻った時にしたい処理を書く。例えば、ナビゲーションバーを隠すとかレイアウトを変えるとかだ。
他のSegueと同様、identifierを設定することができる。コード上で任意のタイミングでunwind segueを使用することができる。

unwind segueの実装方法は以下のように.mに記述する(.hには必要ない)

- (IBAction)関数名:(UIStoryboardSegue*)変数名 {}

{}の中に何かしらの処理を書くこともできる

unwind segueは、原則として自分を除いたviewスタックのトップから見てViewControllerに実装されているところに遷移する。されていない場合は遷移しない。

Q:菱形遷移した場合、途中にないViewControllerにあるunwind segueを使用ただどうなるのか?
A:何も起こらない。エラーも出さない。

Q:同じ名前のunwind segueが複数のView Controllerに定義されていた場合、どうなるのか?
A:viewスタックのトップに近い方に遷移する。

Q:基本的に特定のViewに遷移するが、一つ前に遷移することはできるのか?
A:全てのView Controllerに同じunwind segueを実装すれば可能。