2014-11-21 112 views
3

在我GameScene.swift文件,我想执行SEGUE回到我的菜单 - 视图 - 控制器,像这样: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'' 

我检查了我赛格瑞的标识,它的确是“菜单”。

+0

一个SEGUE用于转到从一个的viewController到另一个,而不是从一个场景到的viewController – ZeMoon 2014-11-21 06:13:21

+0

你需要调用,而不是根本的viewController从现场的的viewController的SEGUE。 – ZeMoon 2014-11-21 07:14:28

回答

9

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

现在的问题是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) 
} 
+0

这工作。那么rootViewController是故事板中的初始视图控制器吗?当我将rootViewController变量输出到控制台时,它显示为我的Menu VC。 – ctdewaters 2014-11-21 12:01:43

+0

根视图控制器是您在应用程序委托中定义的视图控制器,或者是在故事板中的根节点。每个iOS应用都需要一个root VC。当你开始游戏时,你的菜单/根目录VC会对你的SKScene VC执行一个循环。回去之后,需要调用SKScene VC上的segue,而不是根VC上的一个。 – ZeMoon 2014-11-21 12:06:16

+0

嘿家伙,我实现了这一点,它的工作原理除了第四次你从一个场景到一个viewcontroller,其中游戏滞后的地方令人难以置信。我认为这是因为'scene.viewController = self'在你离开场景的另一个视图控制器时不会被解散 - 我将如何解除它,所以这不会发生? – Comrod33 2016-08-23 21:18:02

0

如何从场景原因请看视图控制器

斯威夫特3 - 工程与SpriteKit/UIKit的

您可以使用NSNotification

实施例:

1.)创建在故事板一个SEGUE并命名标识符 “SEGUE”

2.)创建在的ViewController要从segueing的功能。

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)