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

时间:2019-07-09 21:54:54

标签: ios swift uiviewcontroller

道歉,我知道也有类似的问题,但是我一直在寻找能找到的每两个星期,却无法弄清楚(我是一个新手)。

我有几个不同的View Controller,没有使用导航控制器。我可以在他们之间毫无问题地寻找答案。问题是,当我选择一个新视图时,我需要消除每个视图。这是到目前为止我尝试过的一些东西。

选项1(在新的View Controller中)

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

选项2(在旧的View Controller中)

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

在这两种情况下,新视图都被关闭,而我又回到了旧视图。我已经尝试了大约20个类似代码的版本。

我应该将程序中的第一个VC用作“主”视图控制器,并在其顶部显示/关闭所有其他视图吗?当最初加载应用程序后不经常使用“主” VC时,我认为这种方法似乎没有内存效率。

似乎我缺少或不了解某些内容。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

这样考虑:视图控制器不能存在于孤岛上。它必须呈现在某些事物之上。

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

如果您不想彼此展示VC,则有两种选择:

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

2)使用标签栏控制器。如果您的应用程序中只有几个不同的视图控制器,这将是最好的选择,但这对于某些用例来说是很好的。

3)完全按照您在帖子中说的做(使用根视图控制器显示/关闭所有其他VC)。就像我说的那样,您不能凭空提出一个视图控制器-后面总有东西。除非您的根VC中有很多事情在进行,否则这不会引起任何内存问题。除非您非常关注视图控制器之间的动画,否则这种方法应该很好。

通常,在出现内存问题之前,我不会太担心内存使用情况。对于99%的正常用例,最好将视图控制器彼此叠放在一起。

答案 1 :(得分:0)

如果您想从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`