在SKScene中使用UIViewController

在我的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 () has no segue with identifier 'menu'' 

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

您正在根viewController上调用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) } 

如何从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中,将Post方法添加到您希望触发segue的任何位置。

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