弹出到根视图后按UIViewController

时间:2013-03-29 10:39:49

标签: ios

我有一个使用故事板和导航控制器的应用程序。在我的应用程序流程的某个阶段,我在视图堆栈上获得了大约四个视图,此时我必须弹出所有视图,直到我到达根视图。之后我需要手动推送另一个视图。

我尝试了各种没有运气的事情。我试过使用内置的API调用:

[self.navigationController popToRootViewControllerAnimated:YES];

此时我尝试通过引用根视图并调用segue方法来调用push segue。

RootView *obj = [[RootView alloc] init];
[obj callSegue];

或者

[self.navigationController performSegueWithIdentifier:@"pushView" sender:self];

无论如何,我对这一点感到非常难过。有人可以帮忙吗?

更新

感谢大家的回复。我正在挖掘更多的东西并找到了解决方案,我很确定其中之一。

// Reference to navigation controller. Apparently if you use self.navigationController in a popToRootViewController call it sets self.navigationController to nil.
UINavigationController *navigationController = self.navigationController;
[navigationController popToRootViewControllerAnimated:NO];

// Reference to view to push - must set storyboard ID in inspector
ViewToPush *viewRef = (ViewToPush *)[self.storyboard instantiateViewControllerWithIdentifier:@"gameView"];
[navigationController pushViewController:gameView animated:NO];

3 个答案:

答案 0 :(得分:2)

这个怎么样?

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

这会将您的堆栈设置为root,并使用新的控制器和推送动画。如果您需要rootViewController的快速参考,可以使用[[self.navigationController viewControllers] objectAtIndex:0]

答案 1 :(得分:1)

一个很好的解决方案就是使用“Unwind Segue”。基本上,展开segue是一个segue,它将您带回到推送的控制器堆栈中,然后在目标控制器中执行IBAction方法。你想要做的是从你当前的控制器到根目录放松,然后在被调用的方法中调用performSegueWithIdentifier:

这是一个关于展开segues的教程:Tutorial

答案 2 :(得分:0)

Meybe你可以试试这个:

  • 在根VC中设置一个标记(@property),类似于shouldPushAutomatically
  • 在您致电[self.navigationController popToRootViewControllerAnimated:YES];的VC中,实施prepareForSegue:WithIdentifier:方法。在此方法中,使用(MyVC*)segue.destinationViewController访问您的根VC并将您的标记设置为YES
  • 在根VC的viewDidLoad中,尝试调用您的push segue(事实上,您可能需要在viewDidAppear中调用它。)

不确定这是否有效,但这是我试图让它发挥作用的方式。