アンワインドセグエをプログラムで実行する方法は?


307

ストーリーボードを使用すると、これは非常に簡単です。アクションを「終了」にドラッグするだけです。しかし、コードからどのように呼び出す必要がありますか?


33
私はこれが妥当な質問だと思います–私自身が持っていました。手動でセグエを作成し(ファイルの所有者からCtrlキーを押しながらドラッグして終了する)、IBで名前を付け、3。コードで通常の-performSegueWithIdentifier:sender:を実行することで、プログラムからアンセグメントの巻き戻しを実行できます。
Yang Meyer

6
IMOを閉じるべきではありませんでした。この質問の締めくくりに投票したユーザーは、Obj-C / Cocoa Touchの背景を持っていないようです。
LJウィルソン

ヤン:どうやってそれに名前をつけますか?
sarfata

私は[self dismissViewControllerAnimated:YES completion:nil]を使用します。プログラムで終了します。それが正しい方法かどうかはわかりません。
tangqiaoboy 2012年

1
sarfata:まず、Ctrlキーを押しながらビューコントローラーから[終了]にドラッグして、「手動の巻き戻しセグエ」を作成します。その後、ドキュメントアウトラインでセグエを見つけることができます。
ハギー

回答:


283
  1. 手動セグエを作成します(ctrlファイルの所有者から-dragで終了します)。
  2. 緑のEXITボタンの下にある左のコントローラーメニューでそれを選択します。

緑のEXITボタンの下にある左のコントローラーメニューで選択します。

セグエの名前を挿入しておくつろぎください。

次に、- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.あなたのセグエを識別します。


25
1)「ファイルの所有者」-その古い用語ではありませんか?ビューコントローラーからその終了アイコンへのドラッグを制御するのに役立ちました。2)明らかなはずですが、Xcodeは、UIStoryboardSegue引数を取るIBActionのインターフェイスで宣言を探しています。WWDC 2012セッション407の講演では、そのことについては触れられておらず、そのコードも貼り付けられていませんでした。それがないと、コントロールにドラッグしても、Exitアイコンがアクティブになりません。3)大きな赤い矢印の最後の[アクション]フィールドで、「そこに行く」矢印を押すことができるのはとてもクールです。
tobinjim

71
私のように、まだこの回答の実装に問題がある人のために、このリポジトリに詳細なウォークスルーと例をまとめました:github.com/bradley/iOSUnwindSegueProgramatically(自分自身を宣伝するのではなく、壁に頭をぶつけましたこれについて何時間も、そして実際のセットアップを見ることは私を助けます。)
bradleygriffith

3
@bradleygriffithあなたは驚くほどすごいです。素晴らしいウォークスルーをありがとう!
Eli_Rozen 2013

7
@bradleygriffith私もあなたがこれを答えにしてくれればいいので、私もそれをマークアップすることができます!あなたのユニークな貢献は、どのビューコントローラーがどのコードを取得するかを確立することでした。それはどこにも見つかりませんでした。ありがとう!
アーロンベグ2014

3
これでまだ困惑している人にとっての鍵は、IBACTIONが現在のビューコントローラーではなく、戻り先のビューコントローラーにある必要があるということです。@ bradleygriffithがGitHubでこれを説明していますが、私はそれを見たことはありません他の場所で言及しました。その部分は重要です。
Axeva 14

163

Objective CとSwiftの完全な答えは次のとおりです。

1)IBAction目的のビューコントローラ(セグエしたい場所)で巻き戻しセグエを作成します。実装ファイル内の任意の場所。

// Objective C

    - (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }

2)ソースビューコントローラー(セグメンテーション元のコントローラー)で、⌃ +「アクティビティ名」からドラッグして終了します。ポップアップのステップ1で作成されたアンワインドセグエが表示されます。(表示されない場合は、手順1を確認してください)。ポップアップからunwindToContainerVC:を選択するか、ソースコントローラをunwind IBActionに接続するためにメソッドに名前を付けたものを選択します。

ここに画像の説明を入力してください

3)ストーリーボードのソースビューコントローラーのドキュメントアウトライン(下部に表示されます)でセグエを選択し、識別子を付けます。

ここに画像の説明を入力してください

4)ソースビューコントローラからこのメソッドを使用してアンワインドセグエを呼び出し、アンワインドセグエ名を置き換えます。

//目的C

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

//スイフト

self.performSegueWithIdentifier("unwindToContainerVC", sender: self)

NB。unwindメソッドのsegueパラメータのsourceViewControllerプロパティを使用して、ソースコントローラの公開されたプロパティにアクセスします。また、フレームワークがソースコントローラーの非表示を処理することにも注意してください。これを確認したい場合は、ソースコントローラーにdeallocメソッドを追加します。これは、強制終了されたときに発生するログメッセージを含んでいます。deallocが起動しない場合は、保持サイクルがある可能性があります。


2
私のプログラムは機能せず、呼び出されさえしません(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
xhg

2
このソリューションは、巻き戻し中のビューコントローラーがストーリーボードにのみ存在し、別名コード実装にカスタムがない場合は機能しません
mnl

@mnlは何を言っているのか正確にはわかりませんが、ストーリーボードシーンやペン先で機能します。コードでビューコントローラーシーンを作成している場合は、名前にIBを「返す」メソッドを使用しないでください。これらのメソッドはコードとIB間の通信の目的に役立つため、とにかく無効です。それはあなたのコメントに対応していますか?
smileBot 2015

1
ctrl+dragfromからViewControllerto を示すあなたの写真Exitは非常に役に立ちました。ありがとう!
kbpontius

Swift 4.2の場合:self.performSegue(withIdentifier: "unwindToVC"、sender:self)
Reefwing

81

bradleygriffithの答えは素晴らしかった。ステップ10を実行し、簡単にするためにスクリーンショットを作成しました。これはXcode 6のスクリーンショットです。

  1. コントロール内のオレンジ色のアイコンから赤い終了アイコンにドラッグして、ビューにアクション/ボタンなしで巻き戻しを作成します。

ここに画像の説明を入力してください

  1. 次にunwind segue、サイドバーでを選択します。

ここに画像の説明を入力してください

  1. セグエ識別子文字列を設定します。

ここに画像の説明を入力してください

  1. コードからその識別子にアクセスします。
[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];

4
まず、巻き戻しのメソッドを内に含める必要がありますUIViewController。その後、ソリューションは機能します
Alex Cio 2014年

5
Identifierをこの新しいセグエに設定する必要があります!それを忘れないでください。
kraag22 2014年

1
プログラムでソースビューコントローラーに「exit」接続を作成することは可能ですか?
Andrew Kirna

13

[self dismissViewControllerAnimated: YES completion: nil];はあなたを召しに戻すものを使いましたViewController


6
ラリー、前のビューコントローラー、つまり現在終了しているビューコントローラーを表示したい場合は、これは完全に有効なアプローチです。Xcode 4.5の新機能は、1つのビューコントローラーから表示順序のどこかにあるビューコントローラーに「巻き戻す」機能なので、問題が浮上しました。詳細については、WWDC 2012セッション407を参照してください。
tobinjim

11

アンワインドセグエに関するAppleのテクニカルノートからのテキストの引用:プログラム的にのみトリガーされるアンワインドセグエを追加するには、シーンのビューコントローラーアイコンからその終了アイコンにコントロール+ドラッグし、ポップアップメニューから新しいセグエのアンワインドアクションを選択します。

テクニカルノートへのリンク


6

上記のVishal Chaudhryの答えは私にとってうまくいきました。また、次を使用してシークを手動でトリガーするためにも追加します。

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

ViewController内から、ストーリーボードのViewControllerのシーンの下にあるアンワインドセグエを選択する必要があります。また、RHSのプロパティビューで、コードで参照している名前付け子(上記の例では「mySegueName」)がIndentifierフィールドに含まれていることを確認する必要があります。 )。

このステップを省略した場合、上記の行は、シーク名が不明であるという例外をスローします。


3

ios6より前のバージョンで機能する下位互換性のあるソリューション。

- (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated {

    for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) {
        UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i];
        if ([vc isKindOfClass:vcClass]) {
            [self.navigationController popToViewController:vc animated:animated];
            return;
        }
    }
}

2
アンワインドセグエは、ナビゲーションコントローラースタックの特定のクラスにポップバックするだけではありません。
Steve Moser、2015

2

SWIFT 4

1.巻き戻したいコントローラー内にセグエ付きの@IBActionを作成します。

    @IBAction func unwindToVC(segue: UIStoryboardSegue) {

    }

2.ストーリーボードで、ctrlキーを押しながらセグエ(巻き戻し)するコントローラーから、コントローラーサインからドラッグして終了サインに移動し、先ほど作成したメソッドを選択します。

ここに画像の説明を入力してください

3.これで、ドキュメントのアウトラインに「Unwind segue ....」というタイトルの新しい行があることがわかります。次に、この行をクリックし、属性インスペクターを開いて識別子を設定する必要があります(私の場合はunwindSegueIdentifier)。

ここに画像の説明を入力してください

4.あと少しで完了です。次に、巻き戻したいビューコントローラを開き、セグエを実行するメソッドを作成する必要があります。たとえば、ボタンを追加し、@ IBActionを使用してコードに接続します。その後、このIBAction内でperfromSegue(withIdentifier:sender :)メソッドを追加します

     @IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
         performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
     }

だから、あなたがしなければならないのはそれだけです!


プログラムでソースビューコントローラーに「exit」接続を作成することは可能ですか?
Andrew Kirna

1

Swift 4.2、Xcode 10以降

ストーリーボードを介して設定されていない VCでこれを行う方法を疑問に思う方(「プログラムで」+「セグエをほどく」でこの質問に来る人)。

アンワインドセグエをプログラムで設定できないことを考えると、プログラムによる最も簡単な解決策は、次の呼び出しです。

navigationController?.popToRootViewController(animated: true)

これにより、スタック上のすべてのビューコントローラーがルートビューコントローラーにポップバックされます。


ナビゲーションスタックから最上位のビューコントローラーのみをポップするには、次を使用します。

navigationController?.popViewController(animated: true)


1
それは通常あなたが望む以上のものです-一つ戻すには次のようにします:[self.navigationController popViewControllerAnimated:YES];
アンディワインスタイン

確かに、私はそれを私の回答に追加しました
@AndyWeinsteinに

0

参考:@Vadimの回答がView Controller内から呼​​び出される手動の巻き戻しシークアクションで機能するためには、次のコマンドを配置する必要があります。

[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];

オーバーライドされたクラスメソッドviewDidAppearの内部は次のようになります。

-(void) viewDidAppear:(BOOL) animated
{
    [super viewDidAppear: animated];

    [self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}

viewDidLoadviewWillAppearなどの他のViewControllerメソッドに配置した場合、無視されます。


3
間違いです。どこからでもperformSegueWithIdentifierを呼び出します。
smileBot

これは、ビューがロードされるとすぐにアンセグエを実行しませんか?ボタンを押した後など、必要なときに実行するのではなく。
Pahnev 2014

@Pahnevはい、そうです。この回答がどのようにして賛成票を得たかはわかりません。呼び出しperformSegueWithIdentfierはまさにそれを行います:1つのViewControllerから別のViewControllerへのセグエの実行
ezcoding

完全に間違っています。ローンチ直後に巻き戻されます。
Lee Probert 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.