web-dev-qa-db-ja.com

プログラムでUnwind segueを実行する方法

絵コンテを使うとこれはとても簡単です。アクションを「終了」までドラッグするだけです。しかし、どのように私は私のコードからそれを呼び出すべきですか?

294
tadasz
  1. 手動セグエを作成します(ctrl - ファイルの所有者から終了するまでドラッグします。
  2. 緑色の終了ボタンの下にある左のコントローラメニューでそれを選択してください。

Choose it in the Left Controller Menu below green EXIT button

巻き戻すSegueの名前を挿入します。

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

276
Vadim

これがObjective CとSwiftの完全な答えです。

1)移動先のView Controller(移動先)にIBActionアンワインドセグエを作成します。実装ファイルのどこでも。

// Objective C

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

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }

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

enter image description here

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

enter image description here

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

//目標C

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

//迅速

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

NB。ソースコントローラの公開プロパティにアクセスするには、unwindメソッドのsegueパラメータのsourceViewControllerプロパティを使用します。また、フレームワークはソースコントローラの削除を処理します。これを確認したい場合は、killされたら起動するはずのログメッセージと共にdeallocメソッドをソースコントローラに追加してください。 deallocが起動しない場合は、保持サイクルがあるかもしれません。

156
smileBot

bradleygriffithの答えは素晴らしかったです。私はステップ10を取り、単純化のためにスクリーンショットを作りました。これはXcode 6のスクリーンショットです。

オレンジ色のアイコンから赤い終了アイコンまでControlキーを押しながらドラッグすると、ビュー内にアクションやボタンが表示されずに巻き戻しができます。

enter image description here

次にunwind segueを選択し、コードからアクセスするための識別子を設定します。

enter image description here

コードでは、

[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
74
Dean

私は呼び出したViewControllerに戻る[self dismissViewControllerAnimated: YES completion: nil];を使いました。

13
Larry Gibson

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

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

11
Vishal Chaudhry

上記のVishal Chaudhryの答えは私のために働きました。私はまた、手動で隔離を起動するためにそれを追加します:

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

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

この手順を省略すると、上の行では、ファイル名が不明であるという例外がスローされます。

6
Jason Crocker

興味がある人のために、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;
        }
    }
}
3
Joel Teply

Swift 4.2、Xcode 10以降

VCでどうやってこれをするのか疑問に思っている人のためにストーリーボードでは設定できない( "プログラム的に" + "アンワインドセグエ"からこの質問に来る人)。

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

navigationController?.popToRootViewController(animated: true)

これにより、スタック上のすべてのView ControllerがルートView Controllerに戻されます。

1
zb1995

Swift 4

1。コントローラー内にsegueを入れて@ IBActionを作成すると、以下のようにリラックスできます。

    @IBAction func unwindToVC(segue: UIStoryboardSegue) {

    }

2。ストーリーボードで、Ctrlキーを押しながら終了するにはCtrlキーを押しながらドラッグして先ほど作成した方法を選択します。

enter image description here

ドキュメントのアウトラインに "Unwind segue ...."というタイトルの新しい行があることに気付くでしょう。この行をクリックして属性インスペクタを開き、識別子を設定します(私の場合はnwindSegueIdentifier)。

enter image description here

4。あなたはもう終わりです!今、あなたはあなたがほしいと思うView Controllerを開いて、segueを実行するいくつかのメソッドを作成する必要があります。例えば、ボタンを追加して、@ IBActionというコードでそれを接続することができます。その後、この中でIBAction add perfromSegue(withIdentifier:sender:) method :

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

それであなたがしなければならないことはそれだけです!

0
wm.p1us

FYI:@ 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メソッドに入れても無視されます。

0
John Verco