如何使用 swift 关闭和取消初始化 (Game)ViewController?

How to both dismiss and deinit a (Game)ViewController using swift?

我想要实现的目标:从 gameVC 转到 mainmenuVC 并摆脱 gameVC

当应用程序启动时,它首先会显示一个主菜单 viewcontroller,其中有一个游戏按钮 viewcontroller。当用户点击菜单按钮 sprite 时,游戏中的以下函数 viewcontroller 被调用并返回到主菜单:

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 为零。

这是我的故事板的样子: 这是应用程序 运行 时的内存使用情况。这些 spikes/steps 会在游戏 viewcontroller 加载时发生。在我看来问题是,当调用 returnToMainMenu() 时游戏viewcontroller 没有取消初始化。

此外,这永远不会被执行:

 deinit {
    debugPrintln("GameViewController deinitialized")
}

更新:

我删除了这个

navController = self

并像这样在 returnToMainMenu 中定义 navController:

let navController = view.window?.rootViewController as! UINavigationController

继续返回主菜单仍然有效,但它仍然没有取消 vc

当然会内存泄漏。

override func viewDidLoad() {
    navController = self
}

你只是给了自己一个对自己的引用。通常,当您的 vc 离开屏幕时,视图层次结构不再包含该视图,因此该视图被取消。您设置了对自身的引用,因此无论您做什么,它都将始终保存在内存中并且永远不会取消初始化。

我看了斯坦福 iOS8 课程的第 8 讲(在 14:23)后想通了。

问题是我在我的游戏场景中添加了对 gameviewcontroller 的引用,以便从场景中调用其 returnToMainMenu() 方法。为了清除它的内存,所有对 VC 的引用都必须设置为 nil。

我通过直接从我的场景中引用导航控制器解决了这个问题:

(scene!.view!.window?.rootViewController as! UINavigationController).dismissViewControllerAnimated(false, completion: nil)