Swift开发:菜单按钮实现视图控制器跳转的报错解决及返回逻辑配置
图表页菜单跳转崩溃修复与返回导航配置
当前代码的常见崩溃诱因
你写的这段跳转逻辑触发崩溃,基本都来自Storyboard配置不匹配的问题,和按钮本身的IBAction绑定关系不大:
- 代码里通过Storyboard ID实例化控制器时,和Storyboard中设置的ID字符串不完全一致(大小写差异、多余空格都会导致实例化失败)
- 实例化得到的控制器没有绑定对应的
StockSummaryViewController类,强转as!时类型不匹配,直接触发运行时崩溃
1. 菜单按钮实现正常跳转的配置方法
代码侧优化
先把容易触发硬崩溃的强制解包逻辑替换为安全判断,避免一点按钮就闪退:
@IBAction func onSummaryButtonTapped(_ sender: Any) { let storyboard = UIStoryboard(name: "Main", bundle: .main) guard let summaryVC = storyboard.instantiateViewController( identifier: "StockSummaryViewController" ) as? StockSummaryViewController else { print("找不到对应控制器,请检查Storyboard ID与类绑定配置") return } navigationController?.pushViewController(summaryVC, animated: true) }
Storyboard侧核对清单
- 选中Stock Summary对应的控制器,打开右侧Identity检查面板
- Storyboard ID输入框的内容,和代码里写的
StockSummaryViewController保持完全一致 - 类绑定下拉框选中
StockSummaryViewController,不要误选其他系统控制器类 - 确认没有给该控制器设置会触发加载失败的自定义@IBDesignable实现
2. 配置返回按钮直接跳转回Stocks列表页
当前正常导航栈结构为:Stocks列表VC → Stock Chart VC → Stock Summary VC,要实现无论在Chart页还是Summary页,点返回都直接回到Stocks列表,只需要给两个页面的左返回按钮绑定统一的Pop动作即可:
- 在两个控制器的
viewDidLoad方法中,自定义左返回按钮替换系统默认返回按钮,绑定统一的返回逻辑:override func viewDidLoad() { super.viewDidLoad() navigationItem.leftBarButtonItem = UIBarButtonItem( image: UIImage(systemName: "chevron.backward"), style: .plain, target: self, action: #selector(handleBackAction) ) } @objc private func handleBackAction() { // 直接弹出导航栈中除根控制器外的所有页面,回到最初的Stocks列表页 navigationController?.popToRootViewController(animated: true) } - 实际效果说明:Stock Chart VC本身就是导航栈中Stocks VC的下一级页面,系统默认返回逻辑本来就是直接回到Stocks列表;如果之前调整过导航栏样式导致返回失效,套用上面的自定义逻辑即可修复。Stock Summary VC因为在栈的第三级,套用同样的返回逻辑后,会自动跳过中间的Chart页,直接返回根控制器。
注意:如果你的页面跳转是用
present模态弹出而非push进导航栈,需要把返回逻辑替换为dismiss(animated: true),不要强行调用Pop方法,否则会触发空导航控制器的运行时报错。
内容的提问来源于stack exchange,提问作者TheMFA
相关产品推荐
相关产品推荐

