从SKScene过渡到viewController在解包可选值时发现nil

时间:2015-03-26 19:25:55

标签: ios iphone swift sprite-kit

所以我发现了一些关于从Skscene过渡到uiviewcontroller的帖子,我得到了它的工作。每当用户赢得我的游戏级别或输掉时,就会调用此segue和unwind segue。

这适用于level1但是一旦我赢得level2,我就会

 fatal error: unexpectedly found nil while unwrapping an Optional value

在我通过以下功能调用游戏的行

在我的游戏场景中我有:

class GameScene: SKScene, SKPhysicsContactDelegate {

//next level / try again segue
var viewController : GameViewController!
在GameViewController中

我初始化这个属性

    var currentLevel: Int!


override func viewDidLoad() {
    super.viewDidLoad()
    currentLevel = gameScene.currentLevel
    if let scene = GameScene.level(currentLevel) {
        // Configure the view.
        let skView = self.view as SKView
        skView.showsFPS = true
        skView.showsNodeCount = true

        /* Sprite Kit applies additional optimizations to improve rendering performance */
        skView.ignoresSiblingOrder = true

        /* Set the scale mode to scale to fit the window */
        scene.scaleMode = .AspectFill

        skView.presentScene(scene)

        //initialize VC
        scene.viewController = self
    }

 func gameOver() {
    performSegueWithIdentifier("gameOver", sender: nil)
}

@IBAction func perpareForUnwind(unwindSegue: UIStoryboardSegue) {

}

最后我从gameScene的win()函数中调用gameOver

    func newGame() {
    view!.presentScene(GameScene.level(currentLevel))
}

func win() {
    if (currentLevel < 3) {
        currentLevel++
        //present win view - with option to restart, next level, or home
    }
    println(currentLevel)
    runAction(SKAction.sequence([SKAction.waitForDuration(2),
        SKAction.runBlock(newGame)]))
    self.viewController.gameOver() // this is the error!
}

所以这从level1到level2工作​​,但不能从level2到level3

因为viewDidLoad只被调用一次,它只是从lvl1初始化为lvl2然后变为nil。我怎样才能确保它每次都被初始化。我把这个设置代码放在viewDidLoad以外的其他地方吗?

1 个答案:

答案 0 :(得分:0)

从1级到2级,你的var viewController不是nil,因为你在viewDidLoad上将它初始化为self。

但是,在你的下一个级别,viewController是nil,因为你的代码

//initialize VC
scene.viewController = self

仅在GameViewController中的viewDidLoad上执行。

您应该在场景初始化方法或didMoveToView中设置var viewController的值,以便为每个新场景设置它。