我有一个 View Controller 作为我的初始 Controller 和一个游戏场景。我的游戏包含碰撞检测,当检测到碰撞时,需要启动 View Controller 。
检测到碰撞时启动的函数内部如下:
func Collision(Circle: SKSpriteNode, Triangle: SKSpriteNode) {
var mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
var vc = mainStoryboard.instantiateViewControllerWithIdentifier("1") as! UIViewController
self.view!.window?.rootViewController?.presentViewController(vc, animated: true, completion: nil)
}
但这给了我一个错误:
2015-07-04 18:53:52.491 doj[5130:264706] Warning: Attempt to present <doj.ViewControllerStart: 0x14e13630> on <doj.ViewControllerStart: 0x14eef560> whose view is not in the window hierarchy!
(doj是应用程序的名称)
如何从游戏场景访问我的 View Controller 而不出现此错误?
最佳答案
所以,这里的问题是第三行巨大的可选链给了你一些意想不到的东西。您可能会返回其中包含 SKView 的 View Controller (在大多数项目中为 GameViewController.swift ),但它似乎在做一些奇怪的事情。我建议不要尝试调试它,而是创建一个委托(delegate),它允许您从项目中包含的 UIViewController 类调用 presentViewController()
。这将取消对 UIView 的 rootViewController 属性的调用,这可能就是错误所在。
这有几个部分:
在场景文件(例如 GameScene.Swift)中,添加一个协议(protocol),其中包含 SKScene 将发送到 SKViewController 的方法
protocol GameSceneDelegate {
func launchViewController(#scene: SKScene)
}
现在,将以下属性添加到 SKScene
var collisionDelegate: GameSceneDelegate?
现在,在碰撞函数中,您只需调用委托(delegate):
func Collision(Circle: SKSpriteNode, Triangle: SKSpriteNode) {
self.collisionDelegate.launchViewController(scene: self)
}
在您的 View Controller 文件(例如 GameViewController.swift)中,您需要实现此协议(protocol) - 声明它并实现该方法
class GameViewController: UIViewController, GameSceneDelegate {
func launchViewController(scene: SKScene) {
var mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
var vc = mainStoryboard.instantiateViewControllerWithIdentifier("1") as! UIViewController
presentViewController(vc, animated: true, completion: nil)
// note that you don't need to go through a bunch of optionals to call presentViewController
}
// .... OTHER CODE ....
}
最后但并非最不重要的一点是,您需要在调用 skView.presentScene(scene)
之前添加以下代码行
scene.collisionDelegate = self
抱歉,问题很复杂,但是这个委托(delegate)应该可以解决您的问题,或者如果没有解决,问题出在哪里就会很清楚。
关于ios - 如何在 Swift 中从 GameScene 移动到 View Controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31223646/