ios - 如何在 Swift 中从 GameScene 移动到 View Controller

标签 ios swift sprite-kit

我有一个 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/

相关文章:

objective-c - 多个 View Controller 中的 CLLocation

ios - 如何在 swift 中使用 switch 显示 15 行?

sprite-kit - GameViewController 中的 unarchiveFromFile 方法是做什么用的?

ios - 如何更改 Sprite 套件中 Sprite 节点的大小以适应不同的屏幕(Swift)

ios - Unwind Segue 隐藏标签栏

ios - 使用 Storyboard 实现自定义 View 布局

iphone - 如何在谷歌驱动器上上传图片(错误 "Assertion failure in GTMHTTPUploadFetcher connectionDidFinishLoading")

swift - 无法调用类型 : Swift2 的初始值设定项

android - 为 AFNetworking/Alamfire ios 添加拦截器

ios - Sprite Kit bodyAtPoint 和 bodyInRect 返回不正确的值?