47

特定のアクションを実行するためのボタンがあるストーリーボードのビューがあります。ただし、このアクションを実行するには、ユーザーがログインしている必要があります。ボタン ハンドラーは、ユーザーがログインしているかどうかをテストし、YES の場合は 1 つのセグエを実行し、NO の場合は別のセグエを実行します。NO セグエは、ログイン ビュー コントローラーにプッシュします。最初のView Controllerに接続する別のセグエがあるため、ログインが成功すると、ユーザーは中断したところから再開できます。ビュー コントローラーは、ナビゲーション コントローラーに組み込まれています。

問題は、「リターン」セグエがView Controllerのまったく新しいインスタンスをロードし、元のインスタンスを参照していないため、空のインターフェイス要素とそのView Controllerの2つのコピーがメモリに残ることです。

ビュー コントローラの元のインスタンスに戻るにはどうすればよいですか?

4

4 に答える 4

137

push" " を使用することで を使用していると仮定するとUINavigationController、次を使用してスタックの一番上に戻ることができます。

[self.navigationController popToRootViewControllerAnimated:YES];

また

UIViewController *prevVC = [self.navigationController.viewControllers objectAtIndex:<n>];
[self.navigationController popToViewController:prevVC animated:YES];

レベルがある特定のレベルにポップし<n>ます。

また

[self.navigationController popViewControllerAnimated:YES];

ナビゲーション スタックを 1 レベル上に戻すだけの場合。

于 2012-04-04T01:57:19.160 に答える
33

セグエを使用して前のコントローラーに戻る代わりに、セグエに関連付けられたイベントを使用して、現在のビュー コントローラーを閉じる (セグエがモーダルの場合) か、ナビゲーション コントローラーからこれをポップする (セグエがモーダルの場合) 必要があります。押す) 前のコントローラーが自動的に表示されます。

たとえば、ログイン画面のボタンを押したときに戻るモーダル セグエが実行されていた場合、ストーリーボードからセグエを削除し、ログインに成功したときにアクションにリンクするボタンのタッチアップ イベント内で電話します:

 [self dismissViewControllerAnimated:YES completion:nil];

ストーリーボードで、ボタンを右クリックし、送信されたイベント内のタッチアップをビュー コントローラー シーンのファーストレスポンダーにドラッグします。これにより、セグエ遷移を実行したときに実行された逆遷移が実行されます。そのためにモーダルセグエを使用できます。ナビゲーションコントローラーを使用する必要はありません。

ログイン ビューをナビゲーション コントローラーにプッシュした場合は、スタックからポップする必要があります (前のビューに戻る場合)。次のいずれかを使用します。

    [[self navigationController] popViewControllerAnimated:YES];  // goes back to previous view
[[self navigationController] popToViewController: myViewControllerAfterLogin animated:YES]; // goes back to specific view on stack. 
[[self navigationController] popToRootViewControllerAnimated:YES]; // goes back to first view on the stack

アニメーション化されたトランジションは、セグエで使用されるトランジションのタイプを逆にする必要があるため、ビューを閉じるとカールアップがカールダウンします。

于 2013-05-20T21:07:20.780 に答える
5

前に進むためにセグエを使用している場合は、巻き戻すセグエを使用して戻る必要があります。アンワインド セグエの使用方法に関する詳細情報は、テクニカル ノート TN2298 Using Unwind Segues にあります。

于 2015-04-19T16:11:55.857 に答える
2

malhal の言うとおりです。彼のリンクをクリックする価値はあります。

コードは Apple の例から少し移動したようで、さらに柔軟です。3 つのシーンがありますが、カスタム ViewController .m ファイルは 1 つだけです。ナビゲーション スタックは必要ありませんでした。後続のシーンへのアクセスは、ボタンからのセグエです。ベース ビュー コントローラー .m ファイルに次の行を追加しました。

- (IBAction)unwindForSegue:(UIStoryboardSegue *)unwindSegue towardsViewController:(UIViewController *)subsequentVC{}

次に、3 番目のシーンで、ボタンから終了アイコンまでコントロールを押しながらドラッグし、巻き戻しアクションを選択しました。これで、dismissViewController メソッドを呼び出す必要なく、シーン 3 からシーン 2 に戻ります。

于 2016-06-01T12:24:12.697 に答える