我有一个UITabBarController
有两个项目,第一个是日历,只有UIWebView
。第二个项目带来一个SpriteKit游戏场景并隐藏标签栏(游戏需要全屏)。
我有一个SKSpriteNode
图片,当点按时,我希望视图更改回日历视图(第一个标签栏项目)。我已经找到了一种方法来做这个,并尝试了我在StackOverflow上找到的各种建议,但没有任何工作。该应用程序因错误而崩溃
“打开一个可选的”
意外地发现了nil
我明白这个错误意味着什么,而不是为什么我得到它。这是相关的代码(我试图弄清楚这一点时从这里获得的部分代码):
在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()
答案 0 :(得分:1)
你的代码是正确的;我认为可能的问题是你在不转移viewController
的值的情况下呈现多个场景。要解决此问题,请使用“查找”导航器(Cmd + 3)搜索presentScene
,然后确保在之后每次调用已将viewController
属性的值传输到到新场景。
答案 1 :(得分:0)
我认为只需删除“弱”&#39;来自viewController的声明。您可以在给出错误的行上设置断点,并查看viewController是否有值(在Xcode控制台中尝试po self.viewController)。