所以现在我正在编写一个游戏,我遇到了一个我没有找到解决方案的问题.我会试着为你描述一下.
所以,为了能够更好地解释我的问题,我为你们创建了一个示意图:
现在问题在于:我有两个View Controller,一个叫做MenuVc,另一个叫做GameVC.在GameVC中,我有一个SKView,它在调用didMoveToView时显示一个特定的SKScene,名为GameScene. GameScene有一个didBeginContact方法,然后使用以下代码(图中的Segue 1)移动到SKView所拥有的另一个名为GameOverScene的SKScene:
let reveal = SKTransition.crossFadeWithDuration(0.5)
let gameOverScene = GameOverScene(size: self.size, won: false)
self.view?.presentScene(gameOverScene, transition: reveal)
从这里开始,用户可以返回GameScene以重启游戏(图中的Segue 2).在GameScene上,还有另一个按钮,它允许您通过NSNotificationCenter事件(图中的第3章)返回到MenuVC.代码如下:
在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)
所以如果我现在想要使用MenuVC上的Button(图中的Segue 4)回到GameVC,那一切都运行正常. GameVC中的SKView再次显示GameScene,但是当现在调用didBeginContact()时,它不会显示GameOverScene.调用该函数,我检查了它,并且它也在其中执行代码,但是它不执行它应该的segue(1).你有一些想法为什么以及我必须改变什么?当Segue 3被召唤时,是否有关于deiniting的事情?
GameVC的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)
最佳答案 在尝试呈现其他视图控制器之前,请确保关闭每个视图控制器.
我不认为如果你试图在另一个已呈现的视图控制器之上呈现视图控制器,UIKit真的很喜欢它.