使用 SKSpriteNode 作为按钮从 GameScene 过渡到 UITabBarController
Use SKSpriteNode as button to transition from GameScene to UITabBarController
我有一个 UITabBarController
,它有两个项目,第一个是日历,它只是一个 UIWebView
。第二项引入一个SpriteKit游戏场景,隐藏标签栏(游戏需要全屏)。
我有一个 SKSpriteNode
图像,当点击该图像时,我希望视图变回日历视图(第一个选项卡栏项目)。我已经搜索了一种方法来执行此操作,并尝试了我在 Whosebug 上找到的各种建议,但没有任何效果。应用程序崩溃并出现错误
"Unexpectedly found nil while unwrapping an optional"
我明白该错误的含义,只是不知道我为什么会收到它。这是相关代码(其中一部分是我在尝试解决这个问题时从这里获得的):
在GameScene.swift中:
weak var viewController: GameViewController!
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
let touch:UITouch = touches.first! as UITouch
let positionInScene = touch.locationInNode(self)
let touchedNode = self.nodeAtPoint(positionInScene)
if let name = touchedNode.name {
if name == "exit" {
self.viewController.gameOver()
self.removeFromParent()
self.view?.presentScene(nil)
}
}
}
在GameViewController.swift中:
var currentGame: GameScene!
override func viewDidLoad() {
super.viewDidLoad()
self.tabBarController?.tabBar.hidden = true
if let scene = GameScene(fileNamed:"GameScene") {
// Configure the view.
let skView = self.view as! SKView
skView.showsFPS = false
skView.showsNodeCount = false
skView.ignoresSiblingOrder = true
scene.scaleMode = .AspectFill
scene.viewController = self
skView.presentScene(scene)
currentGame = scene
}
}
func gameOver() {
performSegueWithIdentifier("backToMain", sender: nil)
}
这是给出错误的行:
self.viewController.gameOver()
我认为只需从 viewController 的声明中删除 'weak'。您可以在给出错误的行上设置一个断点并查看 viewController 是否有值(在 Xcode 控制台中尝试 po self.viewController)。
您的代码是正确的;我认为可能的问题是您在不传递 viewController
的值的情况下呈现多个场景。要跟踪此问题,请使用查找导航器 (Cmd+3) 搜索 presentScene
,然后确保每个调用都是 在 您已传输 [=10= 的值之后] 属性穿越到新场景
我有一个 UITabBarController
,它有两个项目,第一个是日历,它只是一个 UIWebView
。第二项引入一个SpriteKit游戏场景,隐藏标签栏(游戏需要全屏)。
我有一个 SKSpriteNode
图像,当点击该图像时,我希望视图变回日历视图(第一个选项卡栏项目)。我已经搜索了一种方法来执行此操作,并尝试了我在 Whosebug 上找到的各种建议,但没有任何效果。应用程序崩溃并出现错误
"Unexpectedly found nil while unwrapping an optional"
我明白该错误的含义,只是不知道我为什么会收到它。这是相关代码(其中一部分是我在尝试解决这个问题时从这里获得的):
在GameScene.swift中:
weak var viewController: GameViewController!
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
let touch:UITouch = touches.first! as UITouch
let positionInScene = touch.locationInNode(self)
let touchedNode = self.nodeAtPoint(positionInScene)
if let name = touchedNode.name {
if name == "exit" {
self.viewController.gameOver()
self.removeFromParent()
self.view?.presentScene(nil)
}
}
}
在GameViewController.swift中:
var currentGame: GameScene!
override func viewDidLoad() {
super.viewDidLoad()
self.tabBarController?.tabBar.hidden = true
if let scene = GameScene(fileNamed:"GameScene") {
// Configure the view.
let skView = self.view as! SKView
skView.showsFPS = false
skView.showsNodeCount = false
skView.ignoresSiblingOrder = true
scene.scaleMode = .AspectFill
scene.viewController = self
skView.presentScene(scene)
currentGame = scene
}
}
func gameOver() {
performSegueWithIdentifier("backToMain", sender: nil)
}
这是给出错误的行:
self.viewController.gameOver()
我认为只需从 viewController 的声明中删除 'weak'。您可以在给出错误的行上设置一个断点并查看 viewController 是否有值(在 Xcode 控制台中尝试 po self.viewController)。
您的代码是正确的;我认为可能的问题是您在不传递 viewController
的值的情况下呈现多个场景。要跟踪此问题,请使用查找导航器 (Cmd+3) 搜索 presentScene
,然后确保每个调用都是 在 您已传输 [=10= 的值之后] 属性穿越到新场景