为何嵌入Navigation Controller后返回按钮消失、视图以模态弹出?
问题排查与修复步骤
1. 基础导航栈配置校验
- 打开Storyboard选中你新建的
UINavigationController,在右侧属性检查器确认「Is Initial View Controller」已勾选 - 点击导航控制器的根视图关系segue,确认目标是你设置的新入口视图,不是旧的入口视图
- 确认导航控制器属性检查器的「Bar Visibility」分类下,「Shows Navigation Bar」已勾选
2. 修复顶部留白问题
- 选中入口视图控制器,在属性检查器找到「Extend Edges」选项,确认「Under Top Bars」已勾选
- 打开视图的尺寸检查器,检查顶部约束绑定对象:如果绑定的是安全区顶部,修改为绑定父视图的顶部即可
3. 修复segue模态弹出、无返回按钮问题
你遇到的show segue自动变为模态弹出,核心原因是segue的起始控制器不在导航栈内,系统找不到导航控制器就会默认用模态呈现,按以下步骤排查:
- 选中你创建的show类型segue,在属性检查器确认「Kind」确实为
Show (e.g. Push),不是Present Modally等其他类型 - 确认segue的起始控制器是导航栈内的视图控制器,不能绑定到导航控制器本身,也不能绑定到不在导航栈里的独立控制器
- 如果上述配置无误仍无效,可以废弃segue,用代码实现跳转,提前在Storyboard给目标控制器设置好
Storyboard ID,然后在触发跳转的方法里写入以下代码:
guard let targetVC = storyboard?.instantiateViewController(withIdentifier: "你设置的目标控制器Storyboard ID") else { return } navigationController?.pushViewController(targetVC, animated: true)
- 若push之后仍无返回按钮,可在目标控制器的
viewDidLoad方法内手动添加:
override func viewDidLoad() { super.viewDidLoad() let backBtn = UIBarButtonItem(title: "返回", style: .plain, target: self, action: #selector(backClick)) navigationItem.leftBarButtonItem = backBtn } @objc private func backClick() { navigationController?.popViewController(animated: true) }
4. 修复重启项目后异常复现问题
该问题一般是Xcode缓存未清理、Storyboard修改未保存导致,每次修改后按Command+S手动保存Storyboard,运行前按Command+Shift+K清理项目缓存即可。
内容的提问来源于stack exchange,提问作者Matt Finch
相关产品推荐
相关产品推荐

