【发布时间】:2016-10-14 20:21:52
【问题描述】:
我需要将 UIViewController 作为我的 GameScene 的属性。 所以在调用 presentScene 之前,我用 UIViewController 设置了属性。
我的 UIViewController 类:
class GameViewController: UIViewController {
var scene:GameScene!
override func viewDidLoad() {
super.viewDidLoad()
if let scene = GKScene(fileNamed: "GameScene") {
// Get the SKScene from the loaded GKScene
if let sceneNode = scene.rootNode as! GameScene? {
self.scene=sceneNode
// Set the scale mode to scale to fit the window
sceneNode.scaleMode = .aspectFill
// Present the scene
if let view = self.view as! SKView? {
sceneNode.gameViewController = self //SET THE PROPERTY
view.presentScene(sceneNode)
view.ignoresSiblingOrder = true
view.showsPhysics = true
view.showsFPS = true
view.showsNodeCount = true
}
}
}
}
}
我的 GameScene 类:
class GameScene: SKScene, SKPhysicsContactDelegate {
// MARK: Properties
var gameViewController:GameViewController!
override func sceneDidLoad() {
print(self.gameViewController) // -> CRASH
//DO SOME STUFF
}
}
我遇到了这个崩溃:
fatal error: unexpectedly found nil while unwrapping an Optional value
编辑 1
所以我尝试使用:
override func didMove(to view: SKView) {
super.didMove(to: view)
self.physicsWorld.contactDelegate = self
self.physicsBody!.categoryBitMask = ColliderType.DeviceBounds.rawValue
//ALL MY INIT CODE
}
override func sceneDidLoad() {
super.sceneDidLoad()
//NOTHING HERE
}
但是物理世界不再起作用了。我的崩溃消失了,但物理世界被打破了。
在我的控制台中:
--->GameViewController - viewDidLoad()<---
--->GameScene - sceneDidLoad()<---
--->GameScene - sceneDidLoad()<---
--->GameScene - didMove(to:)<---
--->GameViewController - viewWillAppear<---
--->GameViewController - viewDidAppear<---
【问题讨论】:
-
真正的问题是,你为什么要这样做,这是最好的方法。通过 GameScene 持有 UIViewController,您将面临 GameScecne 和 ViewController 永远不允许释放的风险
标签: ios swift uiviewcontroller sprite-kit skscene