iOS 6とXcode 4.5には「Unwind Segue」と呼ばれる新機能があります。
セグエを巻き戻すと、ストーリーボードのシーンの既存のインスタンスに移行できます。
Xcode 4.5のリリースノートのこの短いエントリに加えて、UIViewControllerには2つの新しいメソッドがあります。
- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier
セグエのアンワインドはどのように機能し、それらは何に使用できますか?
unwind segue ( exit segue とも呼ばれる)を使用して、プッシュ、モーダル、またはポップオーバーの各セグメントをナビゲートできます(ナビゲーションバーからナビゲーション項目をポップする、ポップオーバーを閉じる、モーダルを解除するなど)。表示されたView Controller)それに加えて、実際には1つだけではなく一連のPush/modal/popoverセグをくぐり抜けることができます。 1回の巻き戻し操作で、ナビゲーション階層内の複数のステップを「戻る」ことができます。
巻き戻しセグエを実行するときには、アクションを指定する必要があります。これは、巻き戻し先のView Controllerのアクションメソッドです。
目的語C:
- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}
速い:
@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}
このアクションメソッドの名前は、ストーリーボードで巻き戻しセグエを作成するときに使用されます。さらに、このメソッドは、巻き戻しセグエが実行される直前に呼び出されます。渡されたUIStoryboardSegue
パラメータからソースView Controllerを取得して、セグエを開始したView Controllerと対話することができます(モーダルView Controllerのプロパティ値を取得するなど)。この点で、このメソッドはUIViewController
のprepareForSegue:
メソッドと同様の機能を持っています。
iOS 8アップデート: /巻き戻しセグエは、 表示 および 詳細表示 など、iOS 8のアダプティブセグでも機能します。
ナビゲーションコントローラと3つの子Viewコントローラを持つストーリーボードを作成しましょう。
Green View ControllerからRed View Controllerに戻ることができます。青から緑に、または緑から赤にリラックスすることができます。巻き戻しを有効にするには、RedとGreenに特別なアクションメソッドを追加する必要があります。これがRedのアクションメソッドです。
目的語C:
@implementation RedViewController
- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
}
@end
速い:
@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}
アクションメソッドが追加された後、コントロールアイコンを押しながらExitアイコンをドラッグすることで、ストーリーボードで巻き戻しセグエを定義できます。ここでは、ボタンが押されたときに、緑から赤に戻ります。
展開先のView Controllerで定義されているアクションを選択する必要があります。
青から赤に戻ることもできます(ナビゲーションスタックでは「2ステップ先」です)。重要なのは、正しい巻き戻し操作を選択することです。
巻き戻しセグエが実行される前に、アクションメソッドが呼び出されます。この例では、GreenとBlueの両方からRedにアンワインドセグエを定義しました。 UIStoryboardSegueパラメータを介してアクションメソッドで巻き戻しのソースにアクセスできます。
目的語C:
- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
UIViewController* sourceViewController = unwindSegue.sourceViewController;
if ([sourceViewController isKindOfClass:[BlueViewController class]])
{
NSLog(@"Coming from BLUE!");
}
else if ([sourceViewController isKindOfClass:[GreenViewController class]])
{
NSLog(@"Coming from GREEN!");
}
}
速い:
@IBAction func unwindToRed(unwindSegue: UIStoryboardSegue) {
if let blueViewController = unwindSegue.sourceViewController as? BlueViewController {
println("Coming from BLUE")
}
else if let redViewController = unwindSegue.sourceViewController as? RedViewController {
println("Coming from RED")
}
}
巻き戻しは、プッシュ/モーダルセグエの組み合わせによっても機能します。例えば。モーダルセグエを使用して別のYellow View Controllerを追加した場合は、1ステップでYellowからRedに戻ることができます。
何かをControlキーを押しながらView ControllerのExitシンボルにドラッグして、アンワインドセグエを定義すると、新しいアウトラインがドキュメントのアウトラインに表示されます。
セグエを選択して「属性」インスペクタに移動すると、「識別子」プロパティが表示されます。これを使ってあなたのセグエにユニークな識別子を与えてください:
この後は、他のセグエと同じようにコードからアンワインドセグエを実行できます。
目的語C:
[self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self];
速い:
performSegueWithIdentifier("UnwindToRedSegueID", sender: self)
StoryBoardでのくつろぎの使い方については...
ステップ1)
にしたいView Controllerのコードに移動し、 に戻して次のコードを追加します。
Objective-C
- (IBAction)unwindToViewControllerNameHere:(UIStoryboardSegue *)segue {
//nothing goes here
}
必ずObj-Cの.hファイルでこのメソッドを宣言してください
スイフト
@IBAction func unwindToViewControllerNameHere(segue: UIStoryboardSegue) {
//nothing goes here
}
ステップ2)
ストーリーボードで、あなたが展開したいビューに行き、あなたのボタンから、またはソースビューの右上にある小さなオレンジ色の「終了」アイコンまで、何でもセグエをドラッグしてください。
「 - unwindToViewControllerNameHere」に接続するオプションがあります。
それはそれです、あなたのボタンがタップされたときあなたのセグエはくつろぐでしょう。
巻き戻しセグエは、いくつかのセグエを介して「現在の」View Controllerに到達したView Controllerに「戻る」ために使用されます。
ルートビューコントローラーとしてMyNavController
を含むA
があると想像してください。次に、B
にプッシュセグエを使用します。これで、Navigation ControllerのviewControllers
配列にAとBがあり、Bが表示されます。今、あなたはC
モーダルで提示します。
巻き戻しセグエを使用すると、C
からB
に「戻る」(つまり、モーダル表示されたView Controllerを閉じる)ことができ、基本的にモーダルセグエを「元に戻す」ことができます。ルートビューコントローラーA
に戻って、モーダルセグエとプッシュセグエの両方を元に戻すこともできます。
セグエの巻き戻しにより、バックトラックが簡単になります。たとえば、iOS 6以前では、提示されたView Controllerを破棄するためのベストプラクティスは 提示されたView Controllerを提示されたView Controllerのデリゲートとして設定し、カスタムデリゲートメソッドを呼び出してpresentedViewControllerを破棄します でした。面倒で複雑に聞こえますか?そうだった。それが、セグエをほどくのがいい理由です。
ここの他の回答で言及していなかったのは、最初のセグエがどこから始まったのかわからないときに巻き戻しに対処する方法です。これは私にとってさらに重要なユースケースです。たとえば、2つの異なるView Controllerからモーダル表示するヘルプView Controller(H)があるとします(-AおよびB):
A→H
B→H
正しいView Controllerに戻るように、アンワインドセグエをどのように設定しますか?答えは、AとBで同じ名前でアンワインドアクションを宣言することです。例:
// put in AViewController.Swift and BViewController.Swift
@IBAction func unwindFromHelp(sender: UIStoryboardSegue) {
// empty
}
このように、アンワインドは、セグエを開始したビューコントローラー(AまたはB)を見つけて、それに戻ります。
言い換えれば、巻き戻しアクションは、セグエがどこに向かっているのではなく、どこから来ているかfromを記述していると考えてください。
迅速なiOS:
ステップ1:このメソッドをMASTERコントローラビューに定義します。あなたが戻りたいところ:
//pragma mark - Unwind Seques
@IBAction func goToSideMenu(segue: UIStoryboardSegue) {
println("Called goToSideMenu: unwind action")
}
ステップ2 :(ストーリーボード)あなたのSLAVE/CHILD EXITボタンを右クリックし、Connect goボタンへのアクションとして "goToSideMenu"を選択します。
ステップ3:ビルドして実行する.
たとえば、viewControllerBからviewControllerAに移動した場合、viewControllerAの下のデリゲートが呼び出し、データが共有されます。
@IBAction func unWindSeague (_ sender : UIStoryboardSegue) {
if sender.source is ViewControllerB {
if let _ = sender.source as? ViewControllerB {
self.textLabel.text = "Came from B = B->A , B exited"
}
}
}