簡體   English   中英

如何從GameScene.swift中關閉ViewController?

[英]How can I dismiss a ViewController from my GameScene.swift?

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


情況:我的SpriteKit游戲中有2個VC,如下所示:

ViewController.swift ----按Play -----> GameViewController

當玩家失敗時,我想解散GameViewController,以便玩家可以再次按下play。 我在GameScene.swift中檢查玩家的損失,並希望從那里解散GameVC。


注意:用谷歌搜索沒有成功。


我嘗試過的是:

1)在我的GameScene.swift中創建一個gameVC實例並將其關閉,如下所示:

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

2)做:

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

那些由於明顯原因而無法工作^^

您不想“搶”現有實例: 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緊密地結合在一起,如果您想不使用其他對象就很難使用它們。 但是對於這個簡單的用例,可能很好。

我已經關注了您的一些討論。 我想添加一些代碼,因為通常我傾向於使用一個或兩個ViewController和許多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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM