Segue en SKScene a UIViewController

En mi archivo GameScene.swift, estoy tratando de realizar una transición de regreso a mi controlador de vista de menú como sigue:

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

Este método se ejecuta cuando se toca un nodo:

 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() } } } } 

Donde menuBack es el botón de regreso al menú. Cada vez que ejecuto este código, me arrojan una NSException:

 Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver () has no segue with identifier 'menu'' 

Verifiqué el identificador de mi segue y de hecho fue “menú”.

Está llamando a la segue en la raíz viewController. Creo que ese es el problema. En su lugar, debe llamar a la segue en viewController de la escena (donde asumo que ha creado el segue, por lo tanto, no se encuentra en la raíz viewController).

Ahora el problema es que un SKScene no tiene acceso directo a su viewController, sino solo a la vista en la que está contenido. Necesita crear un puntero a él manualmente. Esto se puede hacer creando una propiedad para SKScene:

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

Luego, en la clase viewController, justo antes de skView.presentScene(scene)

 scene.viewController = self 

Ahora, puedes acceder al viewController directamente. Simplemente llame al segue en este viewController:

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

Cómo pasar de Scene a ViewController

Swift 3 : funciona con SpriteKit / UIKit

Puedes usar NSNotification .

Ejemplo:

1.) Cree un segue en el guión gráfico y nombre el identificador “segue”

2.) Cree una función en ViewController desde la cual está realizando la transición.

 func goToDifferentView() { self.performSegue(withIdentifier: "segue", sender: self) } 

3.) En ViewDidLoad () de su ViewController, usted está realizando la transición desde crear el observador.

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

4.) En el ViewController o Scene al que está seguendo, agregue el Método de envío donde quiera que se active el cambio.

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