2012-04-04 8 views
45

私はストーリーボードに特定の操作を実行するボタンがあります。この操作を実行するには、ユーザーがログインしている必要があります。ボタンハンドラーは、ユーザーがログインしているかどうかをテストし、YESの場合は1つのsegueを実行し、YESの場合はsegueを実行します。 NO seguesはログインビューコントローラにプッシュします。別のセグが最初のView Controllerに接続しているので、ログインが成功した場合、ユーザーは中断した箇所を選択できます。ビューコントローラはナビゲーションコントローラに組み込まれています。すでにロードされているUIViewControllerに戻る方法を教えてください。

問題は、 'return' segueがビューコントローラの全く新しいインスタンスをロードしていて、オリジナルインスタンスを参照していないため、空のインターフェイス要素とそのビューコントローラの2つのコピーがメモリに残ることになります。

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

答えて

135

"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

私はUIBarButtonを持っていますが、それは最初に前の画面のViewDidLoadにロードされています(ここに戻っています)。あなたのコードを使用すると、UIBarはまったく表示されません。どんな考え? – c0d3Junk13

33

segueを使用して以前のコントローラに戻るのではなく、segueに関連付けられているイベントを使用して、現在のView Controllerを終了するか(segueがモーダルだった場合)、ナビゲーションコントローラからポップしますsegueが押された場合)、前のコントローラーが自動的に表示されます。

たとえば、ログイン画面でボタンを押したときに戻ってきたモーダルセグが実行されていた場合は、ストーリーボードからセグを削除して、 、ログイン成功が呼び出す時:ストーリーボードで

[self dismissViewControllerAnimated:YES completion:nil]; 

を、あなたは右のボタンをクリックして、ビューコントローラシーンのファーストレスポンダに送信されたイベント内のタッチをドラッグします。これは、segueトランジションを実行したときに実行された逆方向トランジションを実行します。あなたはモーダルセグを使うことができます。ナビゲーションコントローラを使う必要はありません。

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

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

アニメーションの移行をので、あなたはビューを閉じたときにダウンカールされるまでカール:これらのいずれかを使用します。

+0

プッシュセグの非スライドエフェクトなど、カスタムセグを使用している場合、ポップはカスタムセグの逆ではなく、スライドエフェクトだけになります。 – nenchev

2

malhalは権利である - それは彼のリンクをクリックする価値があります。

コードはAppleの例から少し動いているようで、さらに柔軟性があります。 3つのシーンがありますが、1つのカスタムViewController .mファイルしかありません。私はナビゲーションスタックを望んでいませんでした。後続のシーンへのアクセスは、ボタンからのセグメンテーションです。

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

第3シーン内I出口アイコンにボタンから、ドラッグ制御および巻き戻しのアクションを選択:私は.Mファイルベース・ビュー・コントローラは、この行を追加しました。これで、dismissViewControllerメソッドを呼び出す必要なく、シーン3からシーン2に戻ります。

+0

私が最後に理解した重要なことは、使用している特定の出口セグに関連付けられたunwindActionを実装するコントローラに到達するまで、スタックを巻き戻すということでした。したがって、異なるアンワインドアクションを持つ複数の出口セグを定義してから、それぞれのセグに対して、着陸させたいコントローラ内の特定のアンワインドアクションを実装することができます。 –

関連する問題