所以现在我正在编写一个游戏,但遇到了一个我没有真正找到解决方案的问题。我会尽力为你描述它。
所以,为了能够更好地解释我的问题,我为你们创建了一个示意图:
现在问题是:我有两个视图控制器,一个称为MenuVc
,另一个称为GameVC
. In GameVC
我有一个SKView
这显示了一个特定的SKScene
when didMoveToView
被称为,被命名GameScene
. GameScene
has a didBeginContact
方法,然后将移动到另一个SKScene
the SKView
有,称为GameOverScene
,使用以下代码(图中的 Segue 1):
let reveal = SKTransition.crossFadeWithDuration(0.5)
let gameOverScene = GameOverScene(size: self.size, won: false)
self.view?.presentScene(gameOverScene, transition: reveal)
从这里,用户可以返回GameScene
以重新开始游戏(图中的 Segue 2)。在GameScene
,还有另一个按钮,可以让您返回到MenuVC
via a NSNotificationCenter
事件(图中的Segue 3)。其代码如下:
在 GameViewController.swift 中:
override func awakeFromNib() {
NSNotificationCenter.defaultCenter().addObserver(self, selector: "goToMenuViewController:", name: "GoToMenuViewController", object: nil)
}
@objc func goToMenuViewController(notification: NSNotification){
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("MenuVC")
vc.modalTransitionStyle = UIModalTransitionStyle.CrossDissolve
self.presentViewController(vc, animated: true, completion: nil)
}
deinit{
NSNotificationCenter.defaultCenter().removeObserver(self)
}
在 GameScene.swift 中,当按下 backButton 时:
NSNotificationCenter.defaultCenter().postNotificationName("GoToMenuViewController", object: self)
所以如果我现在想回到GameVC
使用按钮MenuVC
(图中的 Segue 4),一切正常。这SKView
in GameVC
显示了GameScene
再次,但是当didBeginContact()
现在被调用,它不存在GameOverScene
。我检查了该函数被调用,并且它也执行了其中的代码,但它没有执行应有的 segue (1) 。您知道我必须改变的原因和内容吗?调用 Segue 3 时是否与 deiniting 有关?
代码为GameVC
's viewDidLoad
:
let scene = GameScene(size: view.bounds.size)
let skView = view as! SKView
skView.ignoresSiblingOrder = true
scene.scaleMode = .ResizeFill
skView.presentScene(scene)
Segue 4 的代码:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("GameVC")
vc.modalTransitionStyle = UIModalTransitionStyle.CrossDissolve
self.presentViewController(vc, animated: true, completion: nil)