我正在根据下面描述的导航逻辑用SpriteKit和Swift构建游戏。
下面的代码说明了从一个屏幕到另一个屏幕的逻辑(此处从启动屏幕转到首选项设置屏幕或级别选择屏幕)
class StartupScreen: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
let StartView = self.view as SKView
let StartScene = StartSceneClass(size: self.view.bounds.size)
StartView.ignoresSiblingOrder = true
StartScene.scaleMode = .AspectFill
StartView.presentScene(StartScene)
}
+ some other code
}
class StartSceneClass: SKScene
{
+ some init and game logic code…
override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
{
for touch: AnyObject in touches
{
let location = touch.locationInNode(self)
switch self.nodeAtPoint(location)
{
case self.playButton:
let vc = self.view?.window?.rootViewController?.storyboard!.instantiateViewControllerWithIdentifier("ChoixLevelVC") as ChoixLevelVC
self.view?.window?.rootViewController?.presentViewController(vc, animated: true, completion: nil)
case self.BoutonPrefs:
let vc = self.view?.window?.rootViewController?.storyboard!.instantiateViewControllerWithIdentifier("PlayLevelVC") as PlayLevelVC
self.view?.window?.rootViewController?.presentViewController(vc, animated: true, completion: nil)
default:
break
}
}
}
}
我使用与上面相同的逻辑从Level Level屏幕进入Play Level屏幕。
我遇到的问题是:
关于最后一个问题,我想要的是每次退出时都完全杀死/擦除Play Level屏幕。
到目前为止,我已经在SKScene或被调用的UIViewController的UIViewController中实现了self.view?.window?.rootViewController?.dismissViewControllerAnimated(false, completion: nil)
来解除视图控制器。
我已经阅读了许多有关解散UIViewController的方法的内容,我已经明白推荐的方法是从调用ViewController进行操作(在我的情况下,这意味着我应该从Level中解除Play Level屏幕选择屏幕)。但是,我找不到这种方式的Swift示例(很多Obj-C示例,我无法理解)。
我想尽可能少地使用故事板并以编程方式完成大部分任务。今天我只是使用故事板来创建每个ViewController并加载它,因为我找不到编写所有内容的方法。
感谢有关正确实施此类导航逻辑的最佳方式的任何链接或建议。
答案 0 :(得分:0)
当我从等级选择屏幕进入游戏等级屏幕时,我会在转换过程中看到下面的启动屏幕
这听起来像你正在推动的UIViewController具有明确的背景,在这种情况下,你仍然可以看到底层的VC。
当我退出Play Level屏幕时,我会直接返回启动屏幕而不是我来自的Level Choice屏幕
您使用的是popViewController还是popToRootViewController?当使用popViewController时,它应该按预期工作。
第二次从Level Level屏幕进入Play Level屏幕,我找回了前一次的所有精灵。当我关闭UIViewController时,不会删除Play Level屏幕的SKScene。
如果我错了,请纠正我,但是在我理解你弹出UIViewController时,它会在堆/内存中停留一段时间,直到另一个UIViewController被推送到UINavigationController。
你可以尝试在viewWillDisappear中清空你的精灵吗?