我的SpriteKit应用程序(名为CurlShots)在尝试呈现第一个场景(主菜单)时会在启动时崩溃。在模拟器和带有调试版本的设备上,一切正常,但我使用iTunes安装的存档版本我在菜单场景的didMoveToView中崩溃了。
@objc class MenuScene: SKScene { ...
Last Exception Backtrace:
0 CoreFoundation 0x18673c2d8 __exceptionPreprocess + 132 1 libobjc.A.dylib 0x197be80e4 objc_exception_throw + 60 2 CoreFoundation 0x186743290 +[NSObject(NSObject) doesNotRecognizeSelector:] + 220 3 CoreFoundation 0x186740154 ___forwarding___ + 928 4 CoreFoundation 0x186642ccc _CF_forwarding_prep_0 + 92 5 CurlShots 0x10011b208 function signature specialization of CurlShots.MenuScene.didMoveToView (CurlShots.MenuScene)(ObjectiveC.SKView) -> () (MenuScene.swift:71) 6 CurlShots 0x100116c80 @objc CurlShots.MenuScene.didMoveToView (CurlShots.MenuScene)(ObjectiveC.SKView) -> () (MenuScene.swift:0) 7 SpriteKit 0x18afd7770 -[SKScene _didMoveToView:] + 88 8 SpriteKit 0x18afef004 -[SKView presentScene:] + 264 9 CurlShots 0x10012801c function signature specialization of CurlShots.GameViewController.viewWillLayoutSubviews (CurlShots.GameViewController)() -> () (GameViewController.swift:70)
我正在使用自动布局,VC的viewDidLoad没有代码。相反,我是从viewWillLayoutSubviews呈现场景,因为我需要设备屏幕大小来初始化场景
override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() let skView = self.view as! SKView if skView.scene == nil { skView.showsFPS = false skView.showsNodeCount = false skView.ignoresSiblingOrder = true let mainMenu = MenuScene(size: skView.bounds.size) mainMenu.scaleMode = .AspectFill skView.presentScene(mainMenu) } }
我试图从菜单场景的didMoveToView中删除所有代码,但这没有任何效果。还尝试在菜单场景中注释掉变量,尽管它们都不是有条件的。我试图将mainMenu场景保留在一个变量中,以避免它被释放,但这并没有解决崩溃问题。还尝试覆盖场景的init(大小)以验证菜单场景在呈现之前是否实际创建。 不知道还有什么可以尝试的。因为崩溃只发生在归档包中,所以我无法通过设置断点进行调试。
答案 0 :(得分:0)
您是否确保将主菜单设置为第一个视图,方法是转到故事板并在右侧面板上选择“将视图设置为第一个视图”(或类似的东西)?有时会抛出此错误。可能不是整体解决方案,但值得检查
答案 1 :(得分:0)
我通过精心删除代码行找到了问题的解决方案,直到找到根本原因。这看起来更像苹果方面的一个错误,但无论如何改变一个代码行修复了崩溃。
坠机是由要呈现的场景引起的。在didMoveToView内部,我使用UIUserInterfaceIdiom检查设备是否是iPad,出于某种原因,swift在发布版本中不喜欢它。我在代码中根据屏幕宽度计算缩放系数,所以现在我使用该信息来确定设备是否是iPad。所以,我做的代码更改是替换行
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Pad) {
带一行
if(scaling > 2.0) { // if iPad