如何模态弹出UINavigationController并直接显示其堆栈中的第二个控制器
实现方案
方法一:初始化时直接设置导航控制器的栈数组
这是最简洁的实现方式,初始化UINavigationController时直接传入完整的视图控制器栈,弹出后默认会展示栈顶的控制器(也就是你需要的第二个控制器),没有多余的转场动画。
Swift 代码示例
// 初始化栈内的两个控制器 let rootVC = RootViewController() let targetVC = TargetViewController() // 你要直接展示的第二个控制器 // 初始化导航控制器时直接传入完整栈数组 let nav = UINavigationController(viewControllers: [rootVC, targetVC]) // 直接模态弹出即可 present(nav, animated: true)
Objective-C 代码示例
// 初始化栈内的两个控制器 RootViewController *rootVC = [[RootViewController alloc] init]; TargetViewController *targetVC = [[TargetViewController alloc] init]; // 初始化导航控制器时传入完整栈数组 UINavigationController *nav = [[UINavigationController alloc] initWithViewControllers:@[rootVC, targetVC]]; // 模态弹出 [self presentViewController:nav animated:YES completion:nil];
方法二:先无动画Push目标控制器再弹出
如果你的导航控制器已经提前完成初始化,或者需要在Push前插入自定义逻辑,可以先调用无动画的Push方法把目标控制器压入栈,再弹出导航控制器。
Swift 代码示例
let rootVC = RootViewController() let nav = UINavigationController(rootViewController: rootVC) let targetVC = TargetViewController() // 关闭动画Push,不会产生可见的过渡效果 nav.pushViewController(targetVC, animated: false) // 模态弹出导航控制器 present(nav, animated: true)
Objective-C 代码示例
RootViewController *rootVC = [[RootViewController alloc] init]; UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:rootVC]; TargetViewController *targetVC = [[TargetViewController alloc] init]; // 关闭动画Push [nav pushViewController:targetVC animated:NO]; // 模态弹出导航控制器 [self presentViewController:nav animated:YES completion:nil];
注意事项
- 两种方案都会保留完整的导航栈结构,用户点击导航栏返回按钮可以正常回到第一个根控制器,不需要额外适配。
- 不要在导航控制器弹出完成后再调用Push方法,会导致用户看到Push的过渡过程,不符合需求。
- 如果不需要保留根控制器,可以直接把目标控制器设为导航控制器的根控制器,不需要额外处理栈结构。
内容的提问来源于stack exchange,提问作者David Henry
相关产品推荐
相关产品推荐

