【问题标题】:How to present SKScene from UIViewController in swift如何在 swift 中从 UIViewController 呈现 SKScene
【发布时间】:2015-10-20 20:24:03
【问题描述】:

我的 SpriteKit 应用程序(名为 CurlShots)在尝试呈现第一个场景(主菜单)时在启动时崩溃。在模拟器和具有调试版本的设备中一切正常,但使用 iTunes 安装的存档版本我在菜单场景的 didMoveToView 中遇到崩溃。

@objc 类 MenuScene: SKScene {
...
Last Exception Backtrace:
0 CoreFoundation 0x18673c2d8 __exceptionPreprocess + 132
1 libobjc.A.dylib 0x197be80e4 objc_exception_throw + 60
2核心基础0x186743290 + [NSObject(NSObject)不识别选择器:] + 220
3 核心基础 0x186740154 ___转发___ + 928
4 核心基础 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 as! SKView
        如果 skView.scene == nil
        {
            skView.showsFPS = false
            skView.showsNodeCount = false
            skView.ignoresSiblingOrder = true

            让 mainMenu = MenuScene(大小:skView.bounds.size)
            mainMenu.scaleMode = .AspectFill
            skView.presentScene(主菜单)
        }
    }

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

【问题讨论】:

    标签: swift sprite-kit


    【解决方案1】:

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

    【讨论】:

    • 呈现视图控制器被设置为情节提要中的初始视图控制器。如果那是问题,我认为调试版本也应该失败。崩溃一定是由 swift 编译器为发布构建进行的一些优化引起的。
    【解决方案2】:

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

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

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

    有一条线

    if(scaling > 2.0) { // 如果是 iPad 

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多