2016-05-21 59 views
2

問題:如何從我的GameScene.swift中關閉ViewController?如何從我的GameScene.swift中關閉ViewController?


SITUTATION:我有2個風投在我的SpriteKit遊戲,像這樣:

ViewController.swift ----按播放-----> GameViewController

當玩家失去了,我想解散GameViewController,這樣玩家可以再次按下游戲。我在GameScene.swift中檢查玩家的損失,並想從那裏解散GameVC。


N.B:沒有成功Google搜索這一點。


我的嘗試:

1)創建我的GameScene.swift一個gameVC實例,並駁回它像這樣:

let gameVC = GameViewController() 
gameVC.dismissViewController(false,completion: nil) 

2)這樣做:

self.view.window!.rootViewController?.dismissViewControllerAnimated(false, completion: nil)

那些不原因是顯而易見的^^工作

+0

1)不起作用:您需要使用* existing *實例,而不是新的實例。 2)只有在'self.view.window!.rootViewController?'是你的'GameViewController'實例時纔會起作用,但它看起來可能是'ViewController'。 –

+0

@AaronBrager是的,我知道:)這就是爲什麼我把它放在「我試過」部分。我只是看不到如何抓住現有的實例:/ – Coder1000

+1

您需要將'GameScene'作爲視圖控制器的引用,以便它可以關閉它,或者使用委託模式向後通信到控制對象,即VC應該被解僱/自行解僱 –

回答

2

你不想「搶」現有的實例:https://pragprog.com/articles/tell-dont-ask

你需要左右手GameScene到視圖控制器的引用,以便它可以關閉它,或使用委託模式來向後傳達一個控制對象,即VC應該被解僱/解僱。

一個簡單的例子...你可以在適當的時間GameViewController屬性添加到GameScene,則取消VC:

class GameScene: SKScene { 
    var gameVC: GameViewController? 

    func gameDidEnd() { 
     gameVC?.dismissViewControllerAnimated(true) { 
      // if desired, do any cleanup after the VC is dismissed 
     } 
    } 
} 

然後,創建擺在首位的GameScene對象時,只需設置該屬性:

if let gameScene = GameScene(fileNamed: "MyScene") { 
    gameScene.gameVC = someGameVC 
} 

這種簡單的方法將緊密結合GameSceneGameViewController,使之更困難一點,如果你想使用這些OBJE之一沒有其他的。但對於這個簡單的用例,它可能沒問題。

+0

謝謝您的回答,但是SO反對僅鏈接回答,因爲它們可能會失效。你能否請添加一段代碼,以便我可以接受你的答案,並提高它? :) – Coder1000

+0

當然,我很高興。一秒 –

+0

太棒了! Thx :) :) – Coder1000

1

我跟着你的一些討論。我想添加一些代碼,因爲平時我prefeer一個視圖控制器或兩個和許多SKScene和SKNode工作,但在這種情況下可能是有用的,有一個currentViewController參考:

class MyModelScene: SKScene { 
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    var currentViewController : MyModelViewController! = MyModelViewController() 
// MyModelViewController is a customized UIViewController 

    override func didMoveToView(view: SKView) { 
     super.didMoveToView(view) 
     print("---") 
     print("∙ \(NSStringFromClass(self.dynamicType))") 
     print("---") 
    } 
} 

class Level1Scene: MyModelScene { 
    ... 
} 

UIViewController

class PreloadViewController: MyModelViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     if let scene = Level1Scene(fileNamed:"Level1Scene") { 
      // Configure the view. 
      let skView = self.view as! SKView 
      skView.showsFPS = true 
      skView.showsPhysics = true 
      skView.showsNodeCount = true 

      skView.ignoresSiblingOrder = true 

      /* Set the scale mode to scale to fit the window */ 
      scene.scaleMode = .ResizeFill 
      scene.currentViewController = self 
      skView.presentScene(scene) 
     } 
    } 
} 

有了這個代碼,你一直在你的SKScene一個currentViewController參考,您可以檢查它是否要取消或不正確的viewController。

+0

你不需要'NSStringFromClass';所有Swift類型都可以轉換爲字符串。 –

+0

好男人,謝謝,我甚至沒有注意到,因爲來自我的舊代碼+1 –

相關問題