在 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)
}
}
当我从我的菜单场景切换到我的游戏场景时,它运行得非常好。但是,当我试图回去时,这是一场灾难。我得到:在展开 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)
}
}