如何在swift中从UIViewController呈现SKScene

时间:2015-07-29 17:42:34

标签: swift sprite-kit

我的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(大小)以验证菜单场景在呈现之前是否实际创建。 不知道还有什么可以尝试的。因为崩溃只发生在归档包中,所以我无法通过设置断点进行调试。

2 个答案:

答案 0 :(得分:0)

您是否确保将主菜单设置为第一个视图,方法是转到故事板并在右侧面板上选择“将视图设置为第一个视图”(或类似的东西)?有时会抛出此错误。可能不是整体解决方案,但值得检查

答案 1 :(得分:0)

我通过精心删除代码行找到了问题的解决方案,直到找到根本原因。这看起来更像苹果方面的一个错误,但无论如何改变一个代码行修复了崩溃。

坠机是由要呈现的场景引起的。在didMoveToView内部,我使用UIUserInterfaceIdiom检查设备是否是iPad,出于某种原因,swift在发布版本中不喜欢它。我在代码中根据屏幕宽度计算缩放系数,所以现在我使用该信息来确定设备是否是iPad。所以,我做的代码更改是替换行

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Pad) {

带一行

if(scaling > 2.0) { // if iPad