如何使用 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)
我想要实现的目标:从 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 为零。
这是我的故事板的样子:
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)