601

iOS 6 および Xcode 4.5 には、「Unwind Segue」と呼ばれる新しい機能があります。

アンワインド セグエにより、ストーリーボード内のシーンの既存のインスタンスに移行できます

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

セグエの巻き戻しはどのように機能し、何に使用できますか?

4

6 に答える 6

1285

手短に

アンワインド セグエ( exit セグエとも呼ばれる) を使用して、プッシュ、モーダル、またはポップオーバー セグエを戻ることができます (ナビゲーション バーからナビゲーション項目をポップしたり、ポップオーバーを閉じたり、モーダルに表示されたビュー コントローラーを閉じたりした場合と同様)。その上、実際には 1 つだけでなく、一連のプッシュ/モーダル/ポップオーバー セグエを介して巻き戻すことができます。たとえば、単一の巻き戻しアクションでナビゲーション階層の複数のステップを「戻る」ことができます。

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

目的 C:

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

迅速:

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}

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

iOS 8 の更新: Unwind セグエは、ShowShow Detailなどの iOS 8 のアダプティブ セグエでも動作します。

ナビゲーション コントローラーと 3 つの子ビュー コントローラーを含むストーリーボードを作成します。

ここに画像の説明を入力

Green View Controller から、Red View Controller に巻き戻す (戻る) ことができます。青から緑へ、または緑を経由して赤へとくつろぐことができます。巻き戻しを有効にするには、Red と Green に特別なアクション メソッドを追加する必要があります。たとえば、Red のアクション メソッドは次のとおりです。

目的 C:

@implementation RedViewController

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

@end

迅速:

@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}

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

ここに画像の説明を入力

巻き戻したいView Controllerで定義されているアクションを選択する必要があります。

ここに画像の説明を入力

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

アンワインド セグエが実行される前に、アクション メソッドが呼び出されます。この例では、緑と青の両方から赤へのアンワインド セグエを定義しました。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")
    }
}

巻き戻しは、プッシュ/モーダル セグエの組み合わせによっても機能します。たとえば、モーダル セグエを使用して別のイエロー ビュー コントローラーを追加した場合、1 つのステップでイエローからレッドに戻ることができます。

ここに画像の説明を入力

コードからの巻き戻し

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

ここに画像の説明を入力

セグエを選択して属性インスペクターに移動すると、「識別子」プロパティが表示されます。これを使用して、セグエに一意の識別子を付与します。

ここに画像の説明を入力

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

目的 C:

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

迅速:

performSegueWithIdentifier("UnwindToRedSegueID", sender: self)
于 2013-04-05T16:49:38.447 に答える
169

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)

ストーリーボードで、巻き戻したいビューに移動し、ボタンなどからセグエをドラッグして、ソース ビューの右上にある小さなオレンジ色の「EXIT」アイコンまでドラッグします。

ここに画像の説明を入力

「- unwindToViewControllerNameHere」に接続するオプションがあるはずです

それだけです。ボタンをタップすると、セグエが巻き戻されます。

于 2012-10-11T16:07:15.893 に答える
46

アンワインド セグエは、いくつかのビュー コントローラーに「戻る」ために使用され、そこから多くのセグエを経て「現在の」ビュー コントローラーに到達します。

ルート ビュー コントローラーとして何かがあるMyNavControllerとします。A次に、プッシュ セグエを使用しますB。これで、ナビゲーション コントローラーのviewControllers配列に A と B が含まれ、B が表示されます。Cこれで、モーダルに提示できます。

アンワインド セグエを使用すると、基本的にモーダル セグエを「元に戻す」ことで、to から「戻る」C(Bつまり、モーダル表示されたビュー コントローラーを閉じる) ことができます。Aモーダル セグエとプッシュ セグエの両方を元に戻して、ルート ビュー コントローラーに戻ることもできます。

セグエの巻き戻しにより、後戻りが容易になります。たとえば、iOS 6 より前の場合、提示されたビュー コントローラーを閉じるためのベスト プラクティスは、提示されたビュー コントローラーを提示されたビュー コントローラーのデリゲートとして設定し、カスタム デリゲート メソッドを呼び出して、presentedViewController を閉じることでした。面倒で複雑に聞こえますか?そうだった。だからこそ、アンワインド セグエがいいのです。

于 2012-10-02T12:43:40.513 に答える
37

ここの他の回答で言及されていなかったのは、最初のセグエがどこで発生したのかわからない場合の巻き戻しの処理方法です。これは、私にとってさらに重要なユースケースです。たとえば、2 つの異なるビュー コントローラー ( AおよびB )からモーダルに表示するヘルプ ビュー コントローラー ( H ) があるとします。

AH
BH

正しいビュー コントローラーに戻るように、アンワインド セグエをどのように設定しますか? 答えは、AB で同じ名前のアンワインド アクションを宣言することです。次に例を示します。

// put in AViewController.swift and BViewController.swift
@IBAction func unwindFromHelp(sender: UIStoryboardSegue) {
    // empty
}

このように、アンワインドは、セグエを開始したビュー コントローラー ( AまたはB ) を見つけて、それに戻ります。

つまり、アンワインド アクションは、セグエがどこへ行くかではなく、どこから来るかを説明するものと考えてください。

于 2015-12-15T19:33:59.063 に答える