如何正确关闭以前的视图控制器
How to correctly dismiss previous view controller
抱歉,我知道有一些类似的问题,但我已经找了两个星期,通过我能找到的每一个,但无法弄清楚(我有点新手)。
我有几个不同的视图控制器,没有使用导航控制器。我可以在它们之间进行搜索没问题。问题是,当我转到一个新视图时,我需要取消每个视图。这是我到目前为止尝试过的一些方法。
选项 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 作为我的 "main" 视图控制器,presenting/dismissing 所有其他的都在它上面?当 "main" VC 在最初加载应用程序后不经常使用时,我不认为这种方法似乎内存效率高。
看来我缺少或不理解某些东西。任何帮助将不胜感激。
这样想:视图控制器不能存在于孤岛上。它必须呈现在某物之上。
这意味着当您在另一个之上呈现一个 VC 时,呈现视图控制器是您刚刚呈现的新视图控制器的 "foundation"。
如果您不想将 VC 显示在彼此之上,您有两种选择:
1) 使用导航控制器。这可能是最好的方法。您可以呈现或推送任何视图控制器。如果你决定推送,你可以从导航堆栈中删除旧的,或者你可以将它保留在那里以便用户可以返回。使用导航控制器的方法有很多种,它是在控制器之间导航的最灵活的方式。
2) 使用标签栏控制器。如果您的应用程序中只有几个不同的视图控制器,这种方法效果最好,但它适用于某些用例。
3) 完全按照您在 post 中所说的进行(使用根视图控制器 present/dismiss 所有其他 VC)。正如我所说,你不能凭空呈现一个视图控制器——它背后总有一些东西。除非在您的根目录 VC 中发生了很多事情,否则这不会导致任何内存问题。除非您对视图控制器之间的动画非常挑剔,否则这种方法应该没问题。
一般来说,在内存使用成为问题之前,我不会太担心它。对于 99% 的正常用例,将视图控制器彼此叠加呈现应该没问题。
如果您想在 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`
抱歉,我知道有一些类似的问题,但我已经找了两个星期,通过我能找到的每一个,但无法弄清楚(我有点新手)。
我有几个不同的视图控制器,没有使用导航控制器。我可以在它们之间进行搜索没问题。问题是,当我转到一个新视图时,我需要取消每个视图。这是我到目前为止尝试过的一些方法。
选项 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 作为我的 "main" 视图控制器,presenting/dismissing 所有其他的都在它上面?当 "main" VC 在最初加载应用程序后不经常使用时,我不认为这种方法似乎内存效率高。
看来我缺少或不理解某些东西。任何帮助将不胜感激。
这样想:视图控制器不能存在于孤岛上。它必须呈现在某物之上。
这意味着当您在另一个之上呈现一个 VC 时,呈现视图控制器是您刚刚呈现的新视图控制器的 "foundation"。
如果您不想将 VC 显示在彼此之上,您有两种选择:
1) 使用导航控制器。这可能是最好的方法。您可以呈现或推送任何视图控制器。如果你决定推送,你可以从导航堆栈中删除旧的,或者你可以将它保留在那里以便用户可以返回。使用导航控制器的方法有很多种,它是在控制器之间导航的最灵活的方式。
2) 使用标签栏控制器。如果您的应用程序中只有几个不同的视图控制器,这种方法效果最好,但它适用于某些用例。
3) 完全按照您在 post 中所说的进行(使用根视图控制器 present/dismiss 所有其他 VC)。正如我所说,你不能凭空呈现一个视图控制器——它背后总有一些东西。除非在您的根目录 VC 中发生了很多事情,否则这不会导致任何内存问题。除非您对视图控制器之间的动画非常挑剔,否则这种方法应该没问题。
一般来说,在内存使用成为问题之前,我不会太担心它。对于 99% 的正常用例,将视图控制器彼此叠加呈现应该没问题。
如果您想在 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`