[英]How to both dismiss and deinit a (Game)ViewController using swift?
我想要实现的目标:从gameVC到mainmenuVC,摆脱gameVC
当应用程序启动时,它首先会显示一个主菜单viewcontroller,其中包含一个播放按钮,该按钮会分段到gameviewcontroller。 当用户点击菜单按钮时,将调用gameviewcontroller中的以下函数并将其切换回主菜单:
func returnToMainMenu () {
//This works but does not deinit the vc
navController?.dismissViewControllerAnimated(true, completion: nil)
/* this does not do anything:
navController?.popViewControllerAnimated(true)
*/
}
这可能不是它如何正确完成,我认为这可能是问题,但我无法开始工作,因为gameViewController.navigationViewController是零。
这就是我的故事板的样子: 这是应用程序运行时内存使用情况的样子。 每当加载gameviewcontroller时都会出现这些尖峰/步骤。 在我看来,问题是,当调用returnToMainMenu()时,gameviewcontroller不会去初始化。
此外,这永远不会执行:
deinit {
debugPrintln("GameViewController deinitialized")
}
更新:
我删除了这个
navController = self
并在returnToMainMenu中定义了navController,如下所示:
let navController = view.window?.rootViewController as! UINavigationController
segue回到主菜单仍然有效,但它仍然没有取消vc
当然它会记忆泄漏。
override func viewDidLoad() {
navController = self
}
你刚给自己一个参考。 通常当您的vc离开屏幕时,视图层次结构不再保留视图,因此视图会被取消。 你设置了一个对自己的引用,所以无论你做什么,它总会把它自己留在记忆中,永远不会消失。
我在观看了斯坦福iOS8课程的第8讲(14:23)后想出来了。
问题是我在我的gamescene中添加了对gameviewcontroller的引用,以从场景调用它的returnToMainMenu()方法。 为了清除其内存,必须将对VC的所有引用设置为nil。
我通过直接从我的场景中引用导航控制器来解决它,如下所示:
(scene!.view!.window?.rootViewController as! UINavigationController).dismissViewControllerAnimated(false, completion: nil)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.