1. ホーム
  2. ios

[解決済み] Unwind segueは何に使うのか、どう使うのか?

2022-03-16 23:58:51

質問

iOS 6とXcode 4.5には、"Unwind Segue"と呼ばれる新機能があります。

Unwind seguesは、ストーリーボード内の既存のシーンのインスタンスに遷移することができます。

Xcode 4.5のリリースノートにあるこの短い記述に加え、UIViewControllerにいくつかの新しいメソッドが追加されたようだ。

- (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

巻き戻しセグメンテーションの仕組みと用途について教えてください。

どのように解決するのですか?

ひとことで言うと

について アンワインドセグエ (と呼ばれることもあります。 出口セグエ ) は、プッシュ、モーダル、ポップオーバーのセグメントを戻るために使うことができます (ナビゲーションバーからナビゲーションアイテムをポップしたり、ポップオーバーを閉じたり、モーダルに表示されたビューコントローラを解除した場合のように)。さらに、1つだけでなく、一連のプッシュ/モーダル/ポップオーバーのセグメンテーションを実際にアンワインドすることができます。

アンワインドセグを実行する際には、アンワインド先のビューコントローラーのアクションメソッドを指定する必要があります。

Objective-Cです。

- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}

スウィフト

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}

このアクションメソッドの名前は、ストーリーボードでアンワインドセグエを作成するときに使用されます。さらに、このメソッドはアンワインドセグエが実行される直前に呼び出されます。渡されたソースビューコントローラーから UIStoryboardSegue パラメータを使用して、セグメンテーションを開始したビューコントローラと対話します (たとえば、モーダルビューコントローラのプロパティ値を取得するなど)。この点で、このメソッドは prepareForSegue: メソッドの UIViewController .

iOS 8のアップデートです。 巻き戻しセグメンテーションは、iOS 8のアダプティブセグメンテーションでも機能します。 表示する 詳細を表示 .

事例紹介

ナビゲーションコントローラと3つの子ビューコントローラを持つストーリーボードがあるとします。

緑のビューコントローラから、赤のビューコントローラにアンワインド(ナビゲートバック)することができます。Blue からは Green へ、あるいは Green を経由して Red へと巻き戻せます。アンワインドを有効にするには、赤と緑に特別なアクションメソッドを追加する必要があります。

Objective-Cです。

@implementation RedViewController

- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
}

@end

スウィフト

@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}

アクションメソッドを追加した後、ストーリーボードで終了アイコンをコントロールドラッグすることで、巻き戻しセグエを定義することができます。ここでは、ボタンが押されたときに、緑から赤に巻き戻すようにします。

巻き戻し先のビューコントローラーに定義されているアクションを選択する必要があります。

また、BlueからRedに巻き戻すこともできます(ナビゲーションスタックでは、"2歩先"です)。重要なのは、正しいアンワインドアクションを選択することです。

アンワインドセグエが実行される前に、アクションメソッドが呼び出されます。この例では、緑と青の両方から赤へのアンワインドセグを定義しています。UIStoryboardSegueパラメータを使用して、アクションメソッド内のアンワインドソースにアクセスすることができます。

Objective-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")
    }
}

巻き戻しは、プッシュ/モーダルセグメンテーションの組み合わせでも機能します。例えば、モーダルセグエで別の黄色のビューコントローラを追加した場合、黄色から赤に戻るまで一度に巻き戻すことができます。

コードから紐解く

ビューコントローラの終了シンボルに何かをコントロールドラッグして巻き戻しセグエを定義すると、ドキュメントアウトラインに新しいセグエが表示されます。

セグエを選択して、属性インスペクタを表示すると、"Identifier" プロパティが表示されます。これを利用して、セグエに一意な識別子をつけてください。

この後、他のセグエと同じようにコードからアンワインドセグエを実行することができます。

Objective-Cです。

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

スウィフト

performSegueWithIdentifier("UnwindToRedSegueID", sender: self)