将UIView转换为SKView时的程序集崩溃报告

dme*_*err 2 xcode uikit ios sprite-kit swift

我正在SpriteKit中制作一个简单的游戏,我正在尝试使用UIKit制作一个主菜单.我为主菜单创建了一个View控制器,为游戏创建了一个单独的控制器.每当按下播放按钮时,它都会切换到游戏视图控制器,然后呈现第一个场景.然而,每当它试图将游戏视图控制器的UIView转换为SKView以及能够呈现场景时,某些东西都会失败,并且崩溃报告是汇编,我不知道如何调试.我相信它实例化游戏视图控制器两次,因为当我在viewWillLayoutSubviews()方法中放置println()时,它会打印两次.关于这一点的另一篇文章说,在演员阵容期间类型已经是SKView,导致它失败,在这种情况下,这可能意味着当它触发两次时,它会施放一次,然后再次尝试施放并失败.提前致谢!

这是快速的代码

import UIKit
import SpriteKit

class MenuViewController: UIViewController {
    let background = UIImageView(image: UIImage(named: "background.png"))
    let titleImg = UIImageView(image: UIImage(named: "title.png"))

    override func viewDidLoad() {
        background.frame = self.view.frame
        titleImg.frame = CGRectMake(0, 0, self.view.frame.width, 100)
        self.view.addSubview(background)
        self.view.addSubview(titleImg)
        let bp = ButtonPositions(controller: self)
        let play = button(bp.playY, named: "playButton.png")
        let leader = button(bp.leaderY, named: "leaderButton.png")
        let rate = button(bp.rateY, named: "rateButton.png")
        play.addTarget(self, action: "playPressed", forControlEvents: UIControlEvents.TouchDown)
        leader.addTarget(self, action: "leaderPressed", forControlEvents: UIControlEvents.TouchDown)
        rate.addTarget(self, action: "ratePressed", forControlEvents: UIControlEvents.TouchDown)
        self.view.addSubview(rate)
        self.view.addSubview(leader)
        self.view.addSubview(play)
     }

    func button(y:CGFloat, named name:String!) -> UIButton {
        let bp = ButtonPositions(controller: self)
        let img = UIImage(named: name)
        let b = UIButton(frame: CGRectMake(bp.x, y, self.view.frame.width / 1.5, img.size.height))
        b.setImage(img, forState: UIControlState.Normal)
        return b
    }

    func playPressed() {
        println("playPressed") //only prints once
       changeVC()
    }

    func changeVC() {
        self.presentViewController(GameViewController(), animated: true, completion: nil) //maybe initializing the GameViewController twice for some reason?
    }

    func leaderPressed() {

    }

    func ratePressed() {

    }

    func center() -> CGPoint {
        return CGPoint(x: CGRectGetMidX(self.view.frame), y: CGRectGetMidY(self.view.frame))
    }

    override func prefersStatusBarHidden() -> Bool {
        return true
    }
}


class GameViewController: UIViewController {
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        //prepareGame() 
        println("test") //this prints twice, even through the button press event is only triggered once
    }

    func prepareGame() {
            let skView = self.view as SKView //crashes here when called
            let scene = GameScene(size: self.view.bounds.size)
            skView.showsFPS = true
            skView.showsNodeCount = true
            skView.ignoresSiblingOrder = true
            scene.scaleMode = .AspectFill
            skView.presentScene(scene)

    }

    override func shouldAutorotate() -> Bool {
       return true
    }

    override func supportedInterfaceOrientations() -> Int {
        if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
            return Int(UIInterfaceOrientationMask.AllButUpsideDown.toRaw())
        } else {
            return Int(UIInterfaceOrientationMask.All.toRaw())
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func prefersStatusBarHidden() -> Bool {
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)

mor*_*jvr 7

我遇到过同样的问题.我使用iOS的默认Swift Game项目创建了我的项目,默认情况下为SceneKit创建项目,因为我想使用SpriteKit并尝试将我的新场景投射到SKView,它在我试图投射的线上生成了EXC_BAD_ACCESS.为了解决我的问题,我不得不将主故事板中的类更改为SKView,因为它默认为SCNView.

我要遵循的步骤来修复:

  1. 选择主故事板(在我的例子中是Main.storyboard)
  2. 从View Controller下的层次结构中选择视图
  3. 选择"标识"检查器选项卡(右侧的"实用程序"面板)
  4. 在"自定义类"部分下,将类从SCNView更改为SKView

这样做之后问题就消失了.

  • 奇怪的是,当我去查看视图控制器中哪个类时,它是SKView ...我只是实例化一个全新的SKView并将其作为子视图添加到视图控制器的UIView中.谢谢您的帮助! (2认同)