11

新しいビューコントローラを呼び出し、現在のビューコントローラをナビゲーションコントローラスタックから削除します。 たとえば、私はビューコントローラAにあり、私はBに電話します。ナビゲーションコントローラからビューを削除するには

今私はスタックA、Bを持っています。 今はC(Bから)を呼び出したいと思います。 スタックをA、Cにしたい。

ありがとう。

答えて

5

これが答えです。

次のコードは、現在のView Controllerをポップします。

UINavigationController *navController = self.navigationController; 
// retain ourselves so that the controller will still exist once it's popped off 
[[self retain] autorelease]; 
[navController popViewControllerAnimated:NO]; 

そして、これは新しいものをプッシュ:

ViewControllerC *viewC = [[ViewControllerC alloc] init]; 
[navController pushViewController:viewC animated:TRUE]; 

はそれが役に立てば幸い! 2番目の最後のナビゲーションアイテム削除する

+2

どのようにARCを有効にしてこれを行うには?コンパイラは 'retain'の使用を認めません – asdasd

+1

@Oscar、私の解決策、[below](http://stackoverflow.com/a/17328244/1431728)を参照してください。 – JohnK

0

私はあなたが最初にナビゲーションスタックからBをポップしてからCを押し込むことでこれを行うことができると思います。このためには、[UINavigationController popViewControllerAnimated]と[UINavigationController pushViewController:animated]を使用できるはずです。

+0

これは間違いありませんが、完全ではありません。私は最終的にそれが働いているが、それをポップする前にコントローラを保持しなければならないので、後で別のビューをプッシュすることができます。 UINavigationController * navController = self.navigationController; [[自己保持]自動解除]; [navController popViewControllerAnimated:NO]; – Tony

+0

アップルの参考文献によると、http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html UINavigationControllerはサブクラス化されていません。なぜ簡単なことがとても複雑なのか? – Tony

+0

@トニー私の悪い、私はそれを忘れてしまった。前のコメントを無視して編集します。私はそれらをすべて削除します... – barley

4

たとえば

NSMutableArray *navigationStack = [[NSMutableArray alloc] initWithArray: 
    self.navigationController.viewControllers]; 
[navigationStack removeObjectAtIndex:[navigationStack count] - 2]; 
self.navigationController.viewControllers = navigationStack; 

を、ナビゲーションスタックからコントローラBを除去するために、コントローラCにviewDidLoadからこれを実行します。 ARCの文脈では

23

が、ここでは可能なソリューションです:あなたが言うことができるように

NSMutableArray* navArray = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; 
[navArray replaceObjectAtIndex:[navArray count]-1 withObject:nextViewController]; 
[self.navigationController setViewControllers:navArray animated:YES]; 

、このコードは「B」あなたは、スタック(から削除しようとしているビューで通常のプッシュコードを置き換えますあなたの質問で)。行1は、ビューコントローラのリストをナビコントローラスタックからNSMutableArrayにコピーします。 2行目は、最後(一番上)のビューを次のビュー( "C")に置き換えます。 3行目は、実際のnav-controllerのスタックを変更された配列にし、遷移を最上位のアイテムにアニメートします。 (もちろん、あなたがルートのViewControllerでこのコードを使用することはできません。)私は別の方法hereを発見し、ARCのためにそれを適応さ

最初の行があるために必要とされる
UINavigationController *navController = self.navigationController; 
[navController popViewControllerAnimated:NO]; 
[navController pushViewController:someViewController animated:YES]; 

あなたがポップしたらスタックの現在のビューself.navigationControllernilになり、3行目は機能しません。以前の方法と同じ行数ですが、この方法では、スタックを「手動で」手にするのではなく、組み込みメソッドを使用して動作します。

+0

2番目の実装がまさに私が探していたものでした。 – NMunro

+0

ありがとう、説明は優れています! – Michael

-2

このコードを使用できます。

NSMutableArray * navigationArray = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; [navigationArray removeAllObjects]; self.navigationController.viewControllers = navigationArray;

希望はあなたのために働くでしょう。

関連する問題