You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apple弹跳球游戏添加多ViewController崩溃求助(SIGABRT错误)

弹跳球游戏跳转ViewController崩溃问题解决

问题描述

按照Apple《Develop in Swift Explorations》教程制作的弹跳球游戏,将ViewController设为初始场景时运行正常。但新增一个ViewController并通过按钮跳转至游戏ViewController场景时,程序崩溃并报错:

Thread 1: signal SIGABRT

触发崩溃的代码行如下(非自行编写):

return UIApplication.shared.windows[0].rootViewController! as! ViewController

崩溃原因

这段代码存在两个致命问题:

  • 强制解包!和强制类型转换as!:当你把新的ViewController设为初始场景后,UIApplication.shared.windows[0].rootViewController的类型已经不是ViewController,强制转换会直接触发崩溃。
  • 代码逻辑只适配初始场景为游戏ViewController的情况,跳转后全局获取根控制器的逻辑不再成立。

解决方案

1. 替换为安全的类型转换

将崩溃代码修改为安全的可选绑定,避免强制操作引发崩溃:

if let rootVC = UIApplication.shared.windows.first?.rootViewController as? ViewController {
    return rootVC
}
// 根据业务需求处理找不到实例的情况,比如返回nil或抛出提示
return nil

2. 通过跳转上下文直接获取游戏ViewController实例

在初始ViewController的按钮点击事件中,直接从Storyboard实例化目标游戏ViewController,而非全局获取根控制器:

@IBAction func startGame(_ sender: UIButton) {
    // 确保Storyboard中游戏ViewController的Identifier设置为"GameViewController"
    guard let gameVC = storyboard?.instantiateViewController(withIdentifier: "GameViewController") as? ViewController else {
        return
    }
    // 选择合适的跳转方式:push或present
    navigationController?.pushViewController(gameVC, animated: true)
    // present(gameVC, animated: true)
}

3. 检查Storyboard配置

  • 打开Storyboard,选中游戏ViewController,在右侧属性面板的"Identity Inspector"中确认"Storyboard ID"已正确设置(比如上述代码中的GameViewController)。
  • 确认初始ViewController的跳转逻辑已正确关联按钮点击事件。

内容的提问来源于stack exchange,提问作者Jonah Goldfink

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 12:40:01