使用 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= 的值之后] 属性穿越到新场景