我有一个 UITabBarController
,它有两个项目,第一个是日历,它只是一个 UIWebView
。第二项引入一个SpriteKit游戏场景,隐藏标签栏(游戏需要全屏)。
我有一个 SKSpriteNode
图像,当点击它时,我希望 View 变回日历 View (第一个标签栏项目)。我已经搜索了一种方法来执行此操作,并尝试了我在 StackOverflow 上找到的各种建议,但没有任何效果。应用程序因错误而崩溃
"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
的值的情况下呈现多个场景。要追踪此问题,请使用查找导航器 (Cmd+3) 搜索 presentScene
,然后确保每次调用都是在您已传输 viewController 的值之后
属性跨越到新场景。
关于swift - 使用 SKSpriteNode 作为按钮从 GameScene 过渡到 UITabBarController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39057230/