如何正确关闭以前的视图控制器

Posted

技术标签:

【中文标题】如何正确关闭以前的视图控制器【英文标题】:How to correctly dismiss previous view controller 【发布时间】:2019-07-09 21:54:54 【问题描述】:

抱歉,我知道有一些类似的问题,但我一直在寻找两周的时间来解决我能找到的每一个问题,但无法弄清楚(我有点新手)。

我有几个不同的视图控制器,没有使用导航控制器。我可以在它们之间进行切换没有问题。问题是,当我转向一个新的观点时,我需要摒弃每一个观点。以下是我目前尝试过的一些方法。

选项 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?当最初加载应用程序后不经常使用“主”VC 时,我不认为这种方法看起来内存效率高。

似乎我错过了或不理解某些东西。任何帮助将不胜感激。

【问题讨论】:

为什么在准确呈现新视图之前需要关闭每个视图? 我正在尝试优化我的内存使用。目前,大多数应用都围绕着一个 VC,它并不是第一个出现的。我认为最好从内存中删除所有其他内容以优化性能,但请随时告诉我我错了,还有更好的方法:D 【参考方案1】:

这样想:视图控制器不能存在于孤岛上。它必须呈现在某些东西之上。

这意味着当您在另一个 VC 之上呈现一个 VC 时,呈现视图控制器是您刚刚呈现的新视图控制器的“基础”。

如果您不想将 VC 放在一起展示,您有两种选择:

1) 使用导航控制器。这可能是最好的方法。您可以呈现或推送任何视图控制器。如果您决定推送,您可以从导航堆栈中删除旧的,或者您可以将其保留在那里以便用户可以返回。导航控制器的使用方式有很多种,它是在控制器之间导航的最灵活的方式。

2) 使用标签栏控制器。如果您的应用中只有几个不同的视图控制器,这种方法效果最好,但它适用于某些用例。

3) 完全按照您在帖子中所说的去做(使用根视图控制器来展示/关闭所有其他 VC)。正如我所说,你不能凭空呈现一个视图控制器——它背后总是有一些东西。除非您的根 VC 中发生大量事情,否则这不会导致任何内存问题。这种方法应该没问题,除非您非常关注视图控制器之间的动画。

一般来说,在它成为问题之前,我不会太担心内存使用。对于 99% 的正常用例,将视图控制器彼此叠加呈现应该没问题。

【讨论】:

非常感谢!我非常感谢您的解释。我可能会尝试使用导航控制器。我没有,因为我的应用程序没有以传统方式使用后退按钮或导航栏,但我只是将它们隐藏起来。【参考方案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`

【讨论】:

以上是关于如何正确关闭以前的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

使用标签栏控制器离开视图时如何关闭视图

关闭 ViewController 后,我的视图保持在 iOS7 中以前的视图控制器方向

如何将标签内的标签快速传递给另一个视图控制器[关闭]

呈现两个视图控制器,关闭正确的视图控制器

应用程序关闭后如何快速保存全局变量?

从 uitabbarController 视图中关闭模态视图