UINavigationController 弹出到另一个根控制器

UINavigationController pop to another root controller

我有 3 个视图控制器。前2个视图控制器嵌入在UINavigationController中,如截图所示:

起点是 View Controller 1 的 UINavigationController。然后,我推送到 View Controller 3。但是,我希望它弹出到包含 View Controller 2 的 UINavigationController 的根目录。如何更改导航层次结构?

p.s。为便于说明,此故事板已简化;它们是 View Controller 1、2 和 3 之间的许多视图控制器。

您需要更改 rootViewController。只有在同一导航堆栈中,您才能弹出任何视图控制器。

如下更改根视图控制器..

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UITabBarController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"tabBarcontroller"];
[[UIApplication sharedApplication].keyWindow setRootViewController:rootViewController];

由于您要转到的第二个视图控制器不在您的导航堆栈中,因此您无法弹出。你可以做的是在不丢失平滑过渡动画的情况下是:

1: 推送到视图控制器 3

var contr = self.storyboard!.instantiateViewControllerWithIdentifier("3") as! ViewController3
self.navigationController?.pushViewController(contr, animated: true)

2:从view controller 3 push到view controller 2,你可以使用和上面相同的代码,只要确保更改view controller的标识符即可。

3:您现在可以从这里弹出回到您开始的原始屏幕:

self.navigationController?.popToRootViewControllerAnimated(true)

然而,如果您想在不推送的情况下转到视图控制器 2,您可以只显示视图控制器,这将在视图控制器 2 处启动导航堆栈,但会丢失之前的视图。

我最终使用以下代码更改了整个 UINavigationController 层次结构:

// In the View Controller 3's button's `IBAction`:
NSArray *vcs = @[[self.storyboard instantiateViewControllerWithIdentifier:@"NavController1_Identifier"], self];
[self.navigationController setViewControllers:vcs];
[self.navigationController popToRootViewControllerAnimated:YES];

其中 NavController1_Identifier 是第一个 UINavigationController 的故事板标识符。


似乎在这种情况下也可以使用 unwind segue。