如何正确地关闭前一个视图控制器

7

非常抱歉,我知道有一些类似的问题,但我已经找了两个星期,在我找到的每一个问题中都没有找到答案(我有点新手)。

我有几个不同的视图控制器,没有使用导航控制器。我可以轻松地在它们之间进行转场。问题是,当我转到新视图时,我需要关闭每个视图。以下是我迄今为止尝试过的一些方法:

选项1(在新的视图控制器中)

override func viewDidAppear(_ animated: Bool) {
    presentingViewController?.dismiss(animated: false, completion: nil)
}

选项2(在旧视图控制器中)

override func viewDidDisappear(_ animated: Bool) {
    self.dismiss(animated: false, completion: nil)
}

在这两种情况下,新视图将被取消,我会回到旧视图。我试过大约20个类似代码的版本。 那么我应该使用程序中的第一个VC作为我的“主”视图控制器,并在其上呈现/取消所有其他视图吗?当“主”VC在初次加载应用程序后不经常使用时,我认为这种方法似乎不太节省内存。 看起来我错过或不理解某些内容。任何帮助将不胜感激。

为什么在呈现新视图之前需要关闭每个视图? - Rengers
我正在尝试优化内存使用。目前,大部分应用程序都集中在一个视图控制器上,而它不是第一个出现的。我想删除所有其他视图控制器以优化性能,但也欢迎您告诉我我错了,并且有更好的方法:D - Muindor
2个回答

8
想象一下,视图控制器不能独立存在,它必须在其他东西之上呈现。
这意味着当您在另一个视图控制器之上呈现一个视图控制器时,呈现的视图控制器就是新呈现的视图控制器的“基础”。
如果你不想在彼此之上呈现 VC,你有几个选择:
1)使用导航控制器。这可能是最好的方法。您可以呈现或推送任何视图控制器。如果您决定推送,您可以从导航堆栈中删除旧的视图控制器,或者您可以保留它,以便用户可以返回。有很多使用导航控制器的方法,它通常是在控制器之间导航最灵活的方式。
2)使用选项卡控制器。如果您的应用程序中只有少量不同的视图控制器,则这是最佳选择,但对于某些用例也很不错。
3)按照帖子中所说的完全做(使用根视图控制器来呈现/解除所有其他 VC)。正如我所说,您无法从虚空中呈现视图控制器 - 总是必须有一些东西在其后面。除非您的根 VC 中有大量内容,否则这不应该导致任何内存问题。这种方法应该很好,除非您对视图控制器之间的动画非常挑剔。
总的来说,在内存使用成为问题之前,我不会过于担心内存使用。在正常使用情况下,在彼此之上呈现视图控制器应该不会有任何问题。

非常感谢!我真的很感激这个解释。我可能会尝试使用导航控制器。我之前没有考虑过,因为我的应用程序没有传统方式中的返回按钮或导航栏,但我会将它们隐藏起来。 - Muindor

2
如果您想从VC A呈现VC B并在呈现时关闭VC A,您可以使用以下代码。
let parentVC = presentingViewController
dismiss(animated: true) {
    let vc = self.storyboard!.instantiateViewController(withIdentifier...)
    parentVC.present(vc, animated: true)`enter code here`
}  `enter code here`

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接