web-dev-qa-db-ja.com

既にロードされているUIViewControllerに戻る方法は?

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

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

View Controllerの元のインスタンスに戻るにはどうすればよいですか?

47
TijuanaKez

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レベルだけポップしたい場合は、ナビゲーションスタックをバックアップします。

137
Mick MacCallum

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

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

 [self dismissViewControllerAnimated:YES completion:nil];

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

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

    [[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

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

33
TRVD1707

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

5
malhal

マルハルは正しいです-彼のリンクをクリックする価値があります。

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

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

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

2
Tim