【问题标题】:Transitioning to viewController from SKScene found nil when unwrapping optional value展开可选值时发现从 SKScene 转换到 viewController 为零
【发布时间】:2015-03-26 19:25:54
【问题描述】:

所以我发现了一些关于从 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 以外的地方吗?

【问题讨论】:

    标签: ios iphone swift sprite-kit


    【解决方案1】:

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

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

    //initialize VC
    scene.viewController = self
    

    仅在 GameViewController 中的 viewDidLoad 上执行。

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

    【讨论】:

    • 如果我这样做了,我会得到'Receiver () has no segue with identifier 'gameOver'' 我从 viewdidLoad 中删除了 line scene.viewController = self 并在 didMoveToView 添加了 viewController = GameViewController()
    • 我认为这是因为您将 viewController 设置为新的 GameViewController。您应该将其设置为现有的,试试这个:viewController = self.view.window.rootViewController
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    相关资源
    最近更新 更多