在 swift 3 Spritkit 中返回上一个视图时出错

Error with going back to a previous view in swift 3 Spritkit

当我从我的菜单场景切换到我的游戏场景时,它运行得非常好。但是,当我试图回去时,这是一场灾难。我得到:在展开 Optional 值时意外发现 nil。返回代码为:

let menuscene = MenuScene(size: self.size)
menuscene.scaleMode = scaleMode
self.view?.presentScene(menuscene)

它说错误来自的代码是:

PlaygamebtnNode = self.childNode(withName: "PlaygamebtnNode") as! SKSpriteNode
NamelblNode = self.childNode(withName: "NamelblNode") as! SKLabelNode

这很奇怪,因为当游戏启动时,使用此代码就可以了。错误必须来自 views/scenes 的更改。入口 MenuScene class 的代码是:

import SpriteKit
import GameplayKit

class MenuScene: SKScene {
    var PlaygamebtnNode:SKSpriteNode!
    var NamelblNode:SKLabelNode!

    override func didMove(to view: SKView) {

        PlaygamebtnNode = self.childNode(withName: "PlaygamebtnNode") as! SKSpriteNode
        NamelblNode = self.childNode(withName: "NamelblNode") as! SKLabelNode


        PlaygamebtnNode.texture = SKTexture(imageNamed: "Playgamebtn")
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        let touch = touches.first

        if let location = touch?.location(in: self){
            let nodesArray = self.nodes(at: location)

            if nodesArray.first?.name == "PlaygamebtnNode" {
                let transition = SKTransition.flipHorizontal(withDuration: 0.5)

                let nextScene = GameScene(size: self.size)
                self.view?.presentScene(nextScene, transition: transition)
            }
        }
    }
}

这不是普通的 found nil while unwrapping an Optional value question 的原因是因为它不会显示此错误,直到我尝试返回菜单。

问题从这一行开始:

PlaygamebtnNode = self.childNode(withName: "PlaygamebtnNode") as! SKSpriteNode 

因为正如我所说,self.childNode(withName:) 正在返回 nil

然而,真正的问题与这一行有关(leavegamefunc() 内):

let menuscene = MenuScene(size: self.size)

您在 MenuScene.sks 中定义了 PlaygamebtnNode,但您使用了错误的初始值设定项 (MenuScene.init(size:))。

解决方法:

 func leavegamefunc() {
        if let menuScene = MenuScene(fileNamed: "MenuScene"){
            menuScene.scaleMode = scaleMode
            self.view?.presentScene(menuScene)
        }
    }