2014-11-21 36 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)