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
相关产品推荐
相关产品推荐

