web-dev-qa-db-ja.com

Unwindのセゲとは何ですか?またどのように使用しますか?

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

セグエのアンワインドはどのように機能し、それらは何に使用できますか?

570
Imre Kelényi

手短に

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のプロパティ値を取得するなど)。この点で、このメソッドはUIViewControllerprepareForSegue:メソッドと同様の機能を持っています。

iOS 8アップデート: /巻き戻しセグエは、 表示 および 詳細表示 など、iOS 8のアダプティブセグでも機能します。

ナビゲーションコントローラと3つの子Viewコントローラを持つストーリーボードを作成しましょう。

enter image description here

Green View ControllerからRed View Controllerに戻ることができます。青から緑に、または緑から赤にリラックスすることができます。巻き戻しを有効にするには、RedとGreenに特別なアクションメソッドを追加する必要があります。これがRedのアクションメソッドです。

目的語C:

@implementation RedViewController

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

@end

速い:

@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}

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

enter image description here

展開先のView Controllerで定義されているアクションを選択する必要があります。

enter image description here

青から赤に戻ることもできます(ナビゲーションスタックでは「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に戻ることができます。

enter image description here

コードからの巻き戻し

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

enter image description here

セグエを選択して「属性」インスペクタに移動すると、「識別子」プロパティが表示されます。これを使ってあなたのセグエにユニークな識別子を与えてください:

enter image description here

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

目的語C:

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

速い:

performSegueWithIdentifier("UnwindToRedSegueID", sender: self)
1253
Imre Kelényi

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)

ストーリーボードで、あなたが展開したいビューに行き、あなたのボタンから、またはソースビューの右上にある小さなオレンジ色の「終了」アイコンまで、何でもセグエをドラッグしてください。

enter image description here

「 - unwindToViewControllerNameHere」に接続するオプションがあります。

それはそれです、あなたのボタンがタップされたときあなたのセグエはくつろぐでしょう。

166
Travis M.

巻き戻しセグエは、いくつかのセグエを介して「現在の」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を破棄します でした。面倒で複雑に聞こえますか?そうだった。それが、セグエをほどくのがいい理由です。

47
Yang Meyer

ここの他の回答で言及していなかったのは、最初のセグエがどこから始まったのかわからないときに巻き戻しに対処する方法です。これは私にとってさらに重要なユースケースです。たとえば、2つの異なるView Controllerからモーダル表示するヘルプView Controller(H)があるとします(-AおよびB):

AH
BH

正しいView Controllerに戻るように、アンワインドセグエをどのように設定しますか?答えは、ABで同じ名前でアンワインドアクションを宣言することです。例:

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

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

言い換えれば、巻き戻しアクションは、セグエがどこに向かっているのではなく、どこから来ているかfromを記述していると考えてください。

33
shawkinaw

迅速なiOS:

ステップ1:このメソッドをMASTERコントローラビューに定義します。あなたが戻りたいところ:

//pragma mark - Unwind Seques
@IBAction func goToSideMenu(segue: UIStoryboardSegue) {

    println("Called goToSideMenu: unwind action")

}

ステップ2 :(ストーリーボード)あなたのSLAVE/CHILD EXITボタンを右クリックし、Connect goボタンへのアクションとして "goToSideMenu"を選択します。

enter image description here ステップ3:ビルドして実行する.

23
Vinod Joshi

たとえば、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"
            }
            
        }

}
  • Seague Source View Controllerをアンワインド(終了ボタンをVCの終了アイコンに接続し、アンワインジーグに接続する必要があります。

enter image description here

  • Seague Completeのアンワインド - > viewControllerAのTextLabelが変更されました。

enter image description here

1
Tech