如何从GameScene.swift中解除ViewController?

时间:2016-05-21 18:42:56

标签: ios swift uiviewcontroller sprite-kit

问题:如何从GameScene.swift中解除ViewController?

SITUTATION:我的SpriteKit游戏中有2个VC,如下所示:

ViewController.swift ----按Play -----> 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)

由于明显的原因,这些不起作用^^

2 个答案:

答案 0 :(得分: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,如果您想要使用其中一个对象而不使用其他对象,则会更加困难。但对于这个简单的用例,它可能没问题。

答案 1 :(得分:1)

我已经跟进了你的一些讨论。我想添加一些代码,因为通常我首先使用一个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。