我试图理解使用(和不使用)NavigationController 在 ViewController 之间导航的行为,并且在阅读文章和文档时我误解了一些事情,所以我决定问他们。
主要问题是:如果故事板中有多个导航控制器并且想要从一个导航控制器转到另一个导航控制器,会发生什么情况?(这可以通过使用 segues 来实现,就像我们在普通 VC 之间所做的那样,对吗?)
据我了解,NavigationController 代表一堆 ViewController,我们可以在其中弹出和推送这些 VC。现在我们将“位置”从第一个 NavigationController 的 VC 更改为第二个 NavigationController 的 VC,接下来会发生什么?第一个堆栈消失了,现在我们只能在第二个堆栈中工作?如果是这样,是否意味着第一个 NavigationController 的 VC 堆栈已从内存中删除?
也许我完全误解了某些东西,或者也许没有:)。我很高兴看到您的回复,并希望向您询问有关导航机制的更多详细问题。
UPDATE
要点是:假设我们有一个(初始)VC,其中有两个按钮,代表应用程序的两个独立部分。接下来,我们单击第一个按钮并转到一个 NC 的 RootVC,然后返回到初始 VC,然后单击第二个按钮并转到另一个 NC。当我们回到初始 VC 时,第一个 NC 的堆栈发生了什么?从 NC“外部”到达初始 VC 的最佳方法是什么?
UPDATE
我试图了解内存发生了什么以及此时场景中有哪些 VC 等等。也许场景中是否有一些额外的 VC 绝对不重要,也许我们确实需要它们来更快地在 NC(或只是 VC)之间切换。所以我想了解它实际上是如何工作的。
想象一下,您有标准的应用程序链,您可以在初始导航控制器中推送/弹出视图。然后,假设您有不属于该链的不同视图,例如用户个人资料,您将其呈现为模态视图:
现在顶部导航控制器是初始的,因此您从这里开始,而为了使用第二个导航控制器,您必须通过 UIStoryboard 访问它,如下所示(红色箭头):
// Get storyboard
let storyboard = UIStoryboard(name: name, bundle: NSBundle.mainBundle())
// Get profile NC
let profileNC = storyboard.instantiateViewControllerWithIdentifier("LoginNC") as! UINavigationController
但是,如果您确实想从应用程序的某一部分呈现个人资料,因此它不是模态的,您也可以这样做(绿色箭头)。唯一的区别是,现在您不需要第二个导航控制器 - 因此您不需要将 Push Segue 连接到红色 NC,而是直接登录视图控制器。如果你真的尝试连接 NC - NC 然后运行它,你会得到运行时异常,说你做错了。
Memory
所有的 VC 都会留在记忆中,无论你如何呈现它们。当您将某些内容呈现为模态时,这也适用于背景视图。如果由于长链而出现内存问题,您可以在控制器中实现清理/缓存逻辑:
func viewWillAppear(animated: Bool) {
// Call super first
super.viewWillAppear(animated)
// Prepare UI
}
func viewWillDisappear(animated: Bool) {
// Call super first
super.viewWillAppear(animated)
// do some memory cleanup, since view will not be visible atm
}
希望能帮助到你!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)