2011-08-15 47 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