繁体   English   中英

如何使用swift关闭和解除(游戏)ViewController?

[英]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不会去初始化。

app运行时的内存使用情况 此外,这永远不会执行:

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM