使用SKSpriteNode作为按钮从GameScene转换到UITabBarController

时间:2016-08-20 18:04:12

标签: swift sprite-kit uitabbarcontroller segue

我有一个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()

2 个答案:

答案 0 :(得分:1)

你的代码是正确的;我认为可能的问题是你在不转移viewController的值的情况下呈现多个场景。要解决此问题,请使用“查找”导航器(Cmd + 3)搜索presentScene,然后确保在之后每次调用已将viewController属性的值传输到到新场景。

答案 1 :(得分:0)

我认为只需删除“弱”&#39;来自viewController的声明。您可以在给出错误的行上设置断点,并查看viewController是否有值(在Xcode控制台中尝试po self.viewController)。