Segue dans SKScene à UIViewController

Dans mon file GameScene.swift, j'essaye d'effectuer une séquence à mon menu View Controller comme ceci:

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

Cette méthode est exécutée lorsqu'un noeud est sollicité:

 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 est le button de return au menu. Chaque fois que je lance ce code, une exception NSException est lancée:

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

J'ai vérifié l'identifiant de mon segue et c'était bien "menu".

Vous appelez le segue sur la racine viewController. Je pense que c'est le problème. Vous devez appeler le segue sur le viewController de la scène (où je suppose que vous avez créé le segue, donc il n'est pas trouvé sur la racine viewController).

Maintenant, le problème est qu'un SKScene n'a pas un access direct à viewController, mais seulement la vue dans laquelle il est contenu. Vous devez créer un pointeur manuellement. Cela peut être fait en créant une propriété pour le SKScene:

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

Ensuite, dans la class viewController, juste avant skView.presentScene(scene)

 scene.viewController = self 

Maintenant, vous pouvez accéder directement au viewController. Appelez simplement le segue sur cette vueController:

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

Comment passer de Scene à ViewController

Swift 3Fonctionne avec SpriteKit / UIKit

Vous pouvez utiliser NSNotification .

Exemple:

1.) Créez une séquence dans le storyboard et nommez l'identifiant "segue"

2.) Créez une fonction dans le ViewController à partir duquel vous êtes en train de searchr.

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

3.) Dans ViewDidLoad () de votre ViewController vous commencez à créer l'observateur.

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

4.) Dans le ViewController ou la Scène à laquelle vous voulez accéder, ajoutez la méthode Post où vous voulez que le segue soit déclenché.

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