2012-10-17 53 views
0

我面臨UINavigationController問題推的UIView ...如何彈出上NavigationController一個UIViewController,並在同一時間

我有這個層次

UINavigationController 
|- root controller 
|- ViewController A 

和我有ViewController A一個按鈕做東西,並推ViewController B,但我想刪除ViewController A之前添加ViewController B

因此,層次結構是這樣後,進程

UINavigationController 
|- root controller 
|- ViewController B 

它應該是從滑動到ViewController AViewController B,但如果你壓回,這回root Controller

預先感謝您。

回答

3

,您應該使用的UINavigationController的setViewControllers方法,只需添加一個數組的根和ViewController乙

//get the existing navigationController view stack 
NSMutableArray* newViewControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers]; 

//drop the last viewController and replace it with the new one! 
ViewControllerB *childController = [[ViewControllerB alloc] initWithNibName:@"ViewControllerB" bundle:nil]; 
[newViewControllers replaceObjectAtIndex:newViewControllers.count-1 withObject:self]; 

//set the new view Controllers in the navigationController Stack 
[self.navigationController setViewControllers:newViewControllers animated:YES]; 
+0

完美...這是我需要的......謝謝:) –

-2

最好的方法是用一個新的視圖控制器,而不是刪除,並同時推動啓動navigationController ..

從視圖控制器一推,

[self.navigationController initWithRootViewController:ViewControllerB]; 
+0

我覺得navigationController保留了viewcontroller的引用,因此當你彈出它時,它會釋放它。在你的情況下,無論你在導航控制器的堆棧中將會成爲孤兒。你有沒有考慮過這個問題?請讓我知道,如果我錯了。 –

+0

永遠不要在已經初始化的對象上調用任何初始化方法!你也應該總是分配init的返回值,因爲它可以返回另一個對象! –

0

看一看[UINavigationController setViewControllers:animated:]

[self.navigationController setViewControllers:@[rootViewController, viewControllerB] animated:YES]; 

這將導致推動畫。

但說實話:如果你有這樣的用戶界面,你最喜歡不希望首先使用NavigationController,因爲這會讓用戶感到困惑。 UINavigationController實現的隱喻非常簡單。你真的不想搞砸這個。您可能需要查看Apple人機界面指南,然後選擇另一種呈現視圖的選項!

+0

是的,我知道這是一種奇怪的方式......但項目需求需要這樣做......雖然你的回答是正確的,但Lefteris給出更詳細的答案:)謝謝 –