为什么我的 ViewController 在重新打开后不显示另一个 SKScene?
Why does my ViewController not present another SKScene after reopening it?
所以现在我正在编写一个游戏,我遇到了一个我没有真正找到解决方案的问题。我会尽力为你描述它。
所以,为了能够更好的说明我的问题,我画了一张示意图给大家:
现在问题来了:我有两个View Controller,一个叫MenuVc
,另一个叫GameVC
。在 GameVC
中,我有一个 SKView
,它在调用 didMoveToView
时显示特定的 SKScene
,名为 GameScene
。 GameScene
有一个 didBeginContact
方法,然后它将移动到另一个 SKScene
SKView
有,称为 GameOverScene
,使用以下代码(Segue 1 in the绘图):
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
事件返回到 MenuVC
(图中的 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 中,按下后退按钮时:
NSNotificationCenter.defaultCenter().postNotificationName("GoToMenuViewController", object: self)
因此,如果我现在想使用 MenuVC
上的按钮返回 GameVC
(图中的 Segue 4),一切正常。 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 真的喜欢它。
所以现在我正在编写一个游戏,我遇到了一个我没有真正找到解决方案的问题。我会尽力为你描述它。
所以,为了能够更好的说明我的问题,我画了一张示意图给大家:
现在问题来了:我有两个View Controller,一个叫MenuVc
,另一个叫GameVC
。在 GameVC
中,我有一个 SKView
,它在调用 didMoveToView
时显示特定的 SKScene
,名为 GameScene
。 GameScene
有一个 didBeginContact
方法,然后它将移动到另一个 SKScene
SKView
有,称为 GameOverScene
,使用以下代码(Segue 1 in the绘图):
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
事件返回到 MenuVC
(图中的 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 中,按下后退按钮时:
NSNotificationCenter.defaultCenter().postNotificationName("GoToMenuViewController", object: self)
因此,如果我现在想使用 MenuVC
上的按钮返回 GameVC
(图中的 Segue 4),一切正常。 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 真的喜欢它。