我有一个使用故事板和导航控制器的应用程序。在我的应用程序流程的某个阶段,我在视图堆栈上获得了大约四个视图,此时我必须弹出所有视图,直到我到达根视图。之后我需要手动推送另一个视图。
我尝试了各种没有运气的事情。我试过使用内置的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];
答案 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你可以试试这个:
@property
),类似于shouldPushAutomatically
[self.navigationController popToRootViewControllerAnimated:YES];
的VC中,实施prepareForSegue:WithIdentifier:
方法。在此方法中,使用(MyVC*)segue.destinationViewController
访问您的根VC并将您的标记设置为YES
。viewDidLoad
中,尝试调用您的push segue(事实上,您可能需要在viewDidAppear
中调用它。)不确定这是否有效,但这是我试图让它发挥作用的方式。