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。
我有 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。