我有一个视图控制器作为我的初始控制器和游戏场景。我的游戏包括碰撞检测,当检测到它时,它需要启动视图控制器。
检测到碰撞时启动的函数内部是:
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是应用程序的名称)
如何在不给出此错误的情况下从游戏场景中访问我的视图控制器?
答案 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
对于复杂性感到抱歉,但是这个代表应该解决您的问题,或者如果不能解决,问题就在哪里。