我的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)didNotRecognizeSelector:] + 220
3 CoreFoundation 0x186740154 ___forwarding___ + 928
4 CoreFoundation 0x186642ccc _CF_forwarding_prep_0 + 92
5 CurlShots 0x10011b208 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 CurlShots.GameViewController.viewWillLayoutSubviews(CurlShots.GameViewController)()->()的函数签名特化(GameViewController.swift:70)

我正在使用自动布局,VC的viewDidLoad没有代码。相反,我从viewWillLayoutSubviews中呈现场景,因为我需要设备屏幕尺寸来初始化场景

覆盖func viewWillLayoutSubviews(){
        super.viewWillLayoutSubviews()

        让skView = self.view为!视景
        如果skView.scene == nil
        {
            skView.showsFPS =否
            skView.showsNodeCount = false
            skView.ignoresSiblingOrder = true

            让mainMenu = MenuScene(size:skView.bounds.size)
            mainMenu.scaleMode = .AspectFill
            skView.presentScene(mainMenu)
        }
    }

我试图从菜单场景的didMoveToView中删除所有代码,但这没有效果。还尝试注释掉菜单场景中的变量,尽管它们都不是有条件的。我试图将mainMenu场景保留在变量中,以避免被释放,但这并不能解决崩溃问题。还尝试覆盖场景的init(size)以验证菜单场景在呈现之前是否已真正创建。
不知道还能尝试什么。因为崩溃仅发生在已归档的程序包中,所以我无法通过设置断点进行调试。

最佳答案

您是否确定通过进入故事板并在右侧面板上选择“将视图设置为第一视图”(或类似方法)将“主菜单”设置为第一视图?有时这会引发此错误。可能不是整体解决方案,但值得检查

关于swift - 如何从UIViewController快速呈现SKScene,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31707497/

10-13 09:27