2014-11-21 7 views
3

В моем файле GameScene.swift, я пытаюсь выполнить переход назад к моему меню View Controller, как так:Segue в SKScene к UIViewController

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, и это было действительно «меню».

+0

переход используется для перехода от одного ViewController к другому, а не от одной сцены к ViewController – ZeMoon

+0

Вы должны вызвать SEGUE от ViewController сцены, вместо корня ViewController. – ZeMoon

ответ

9

Вы вызываете segue на корневой viewController. Я думаю, что это проблема. Вы должны вызвать segue на viewController сцены вместо этого (где я предполагаю, что вы создали segue, следовательно, он не находится на корневом viewController).

Теперь проблема заключается в том, что SKScene не имеет прямого доступа к его viewController, а просто к виду, в котором он содержится. Вам нужно создать указатель на него вручную. Это может быть сделано путем создания свойства для SKScene:

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

Тогда в классе ViewController, как раз перед skView.presentScene(scene)

scene.viewController = self 

Теперь вы можете получить доступ к ViewController непосредственно. Просто вызовите SEGUE на этом ViewController:

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

Это сработало. Итак, rootViewController - контроллер начального представления в раскадровке?Когда я печатал переменную rootViewController на консоли, она отображалась как мое меню VC. – ctdewaters

+0

Корневой viewController - это тот, который вы определяете в делегате приложения, или с корневым сегментом в раскадровке. Для каждого приложения iOS требуется корневой VC. При запуске игры ваше меню/корневой VC выполняет segue для вашего SKScene VC. Для возврата нужно вызывать segue на SKScene VC, а не на корневом VC. – ZeMoon

+0

Эй, ребята, я реализовал это, и он работает, только после 4-го раза, когда вы переходите от сцены к viewcontroller, где игра ходит невероятно. Я думаю, что это потому, что 'scene.viewController = self' не увольняется, когда вы покидаете viewController сцены для другого - как бы я его отклонил, чтобы этого не случилось? – Comrod33

0

Как непосредственно перейти от сцены к ViewController

Swift 3 - Работает с SpriteKit/UIKit

Вы можете использовать NSNotification.

Пример:

1.) Создайте SEGUE в раскадровке и назовите идентификатор "SEGUE"

2.) Создать функцию в ViewController вы segueing с.

func goToDifferentView() { 

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

} 

3.) В ViewDidLoad() вашего ViewController вы segueing от создания наблюдателя.

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

4.) В ViewController или Scene вы segueing к, добавьте сообщение Method везде, где вы хотите, чтобы переход к срабатывать.

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