2011-08-15 48 views
0

我在我的UINavigationController中有3個UIViewControllers。 在某些時候,我想要去rootViewController,然後從那裏導航到一個新的UIViewController,它不會工作。iOS - 奇怪的導航問題?

有什麼建議嗎?

- (IBAction)goToRootAndNavigateToViewController 
{ 
    [self.navigationController popToRootViewControllerAnimated:YES]; 

    MyViewController *mvc = [[MyViewController alloc] init]; 
    [self.navigationController pushViewController:mvc animated:YES]; 
    [mvc release]; 

    //This takes me to the rootViewController but it doesn't navigate to MyViewController 
} 

嘗試使用performSelector:WithDelay:

- (void)goToRootAndNavigateToViewController 
{ 
    [self.navigationController popToRootViewControllerAnimated:YES]; 

    [self performSelector:@selector(doSomething) withObject:nil afterDelay:10]; 
} 

- (void)doSomething 
{ 
    MyViewController *mvc = [[MyViewController alloc] init]; 
    [self.navigationController pushViewController:mvc animated:YES]; 
    [mvc release]; 
} 

回答

0

相信popToRootViewController佔據了全NSRunLoop。

您需要使用類似performSelector:withObject:afterDelay這樣的獨立函數推動下一個視圖控制器。

,或者你總是可以只是做一個[self.navigationController setViewControllers:]電話進行手動設置

+0

添加延遲是hacky,並設置ViewController不適用於我或者因爲我需要讓我的根視圖控制器 – aryaxt

+0

設置延遲不hacky。這些方法被放入sdk是有原因的 - 在NSRunLoop中做這樣的事情。如果需要,可將延遲間隔設置爲0.0。並設置視圖控制器,同時保持根視圖控制器不應該是一個問題。只保存一個對你的根視圖控制器的引用,並把它作爲你傳遞給'setViewControllers:animated'的NSArray中的第一個元素,並且你仍然將它作爲根 – cpjolicoeur

+0

我試過延遲它不起作用,我嘗試設置延遲到15秒,它仍然沒有工作 – aryaxt

0

你需要把你的mvc控制器動畫完成時。嘗試調用它,一旦第一個動畫完成(例如在- (void)viewDidAppear:(BOOL)animated

0

我不知道你爲什麼面臨這個問題,但你可以嘗試的一個解決方案是推動你的根視圖控制器的-viewDidAppear:方法中的新視圖控制器。

0

我想它與你當前的視圖控制器使用- (IBAction)goToRootAndNavigateToViewController,一旦被彈出失去控制。因此,使連續的陳述不起作用。

如果我是你,我會確保推動MyViewController實例始終在您選擇的rootViewController進行,而不是從它打算從UINavigationController彈出並有可能被釋放,釋放當前視圖 - 控制。

也許,你可能要添加委託方法實施,如- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animatedrootViewController

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { 
    // Check the right condition for pushing MyViewController... 
    // if it's YES... 
    MyViewController *mvc = [[MyViewController alloc] init]; 
    [self.navigationController pushViewController:mvc animated:YES]; 
    [mvc release]; 
} 

在此實現,你可能會推MyViewController實例。你必須事先做的一件事是使用某種有條件的標誌,這將確保情況是正確的popToRootViewController然後推MyViewController