在SKScene中使用UIViewController

时间:2014-11-21 03:02:31

标签: ios swift sprite-kit segue

在我的GameScene.swift文件中,我正在尝试将segue执行回我的菜单视图控制器,如下所示:

func returnToMainMenu(){
    var vc: UIViewController = UIViewController()
    vc = self.view!.window!.rootViewController!
    vc.performSegueWithIdentifier("menu", sender: vc)
}

点击节点时会运行此方法:

override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)
        if gameOn == false{
            if restartBack.containsPoint(location){
                self.restartGame()
            }
            else if menuBack.containsPoint(location){
                self.returnToMainMenu()
            }
            else if justBegin == true{
                self.restartGame()
            }
        }
    }
}

其中menuBack是返回菜单的按钮。每次运行此代码时,都会抛出NSException:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver (<ProxyBlock.Menu: 0x165a3e90>) has no segue with identifier 'menu''

我检查了我的segue标识符,确实是“菜单”。

2 个答案:

答案 0 :(得分:8)

您正在根视图控制器上调用segue。我认为这就是问题所在。你需要在场景的viewController上调用segue(我假设你创建了segue,因此它没有在根viewController上找到)。

现在问题是SKScene没有直接访问它的viewController,而只是它所包含的视图。您需要手动创建指向它的指针。这可以通过为SKScene创建属性来完成:

class GameScene: SKScene {
    var viewController: UIViewController?
    ...
}

然后,在viewController类中,就在skView.presentScene(scene)

之前
scene.viewController = self

现在,您可以直接访问viewController。只需在此viewController上调用segue:

func returnToMainMenu(){
    self.viewController.performSegueWithIdentifier("menu", sender: vc)
}

答案 1 :(得分:0)

如何从Scene转到ViewController

Swift 3 - 适用于SpriteKit / UIKit

您可以使用 NSNotification

示例:

1。)在故事板中创建一个segue,并将标识符命名为“segue”

2。)在您正在进行的ViewController中创建一个函数。

func goToDifferentView() {

    self.performSegue(withIdentifier: "segue", sender: self)

}

3.。)在ViewController的ViewDidLoad()中,你要创建观察者。

NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: "segue" as NSNotification.Name, object: nil)

4。)在ViewController或Scene中,您可以在任何想要触发segue的位置添加Post方法。

NotificationCenter.default.post(name: "segue" as NSNotification.Name, object: nil)