如何从Swift中的GameScene转移到View Controller

时间:2015-07-04 17:59:30

标签: ios swift sprite-kit

我有一个视图控制器作为我的初始控制器和游戏场景。我的游戏包括碰撞检测,当检测到它时,它需要启动视图控制器。

检测到碰撞时启动的函数内部是:

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!

但这给了我一个错误:

SenderAvatar = conx.tblMessages.FirstOrDefault( mu=>mu.Id == ux.Id).ImageURL,

(doj是应用程序的名称)

如何在不给出此错误的情况下从游戏场景中访问我的视图控制器?

1 个答案:

答案 0 :(得分:0)

所以,这里的问题是第三行的巨大可选链给你一些不可思议的东西。您可能会返回其中包含SKView的视图控制器(大多数项目中的GameViewController.swift),但它似乎正在做一些奇怪的事情。我建议创建一个委托,而不是尝试调试它,这将允许您从项目中包含的UIViewController类调用presentViewController()。这将取消对UIView的rootViewController属性的调用,这可能是错误所在。

这有几个部分:

在你的场景文件(例如GameScene.Swift)中,添加一个协议,其中包含SKScene将发送给SKViewController的方法

protocol GameSceneDelegate {

    func launchViewController(#scene: SKScene)
}

现在,将以下属性添加到SKScene

var collisionDelegate: GameSceneDelegate?

现在,在碰撞功能中,您只需调用委托:

func Collision(Circle: SKSpriteNode, Triangle: SKSpriteNode) {
    self.collisionDelegate.launchViewController(scene: self)
}

在View Controller文件(例如GameViewController.swift)中,您需要实现此协议 - 声明它并实现方法

 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

对于复杂性感到抱歉,但是这个代表应该解决您的问题,或者如果不能解决,问题就在哪里。