ios - 多个导航控制器之间的导航

ios - Navigation between multiple NavigationControllers

我试图了解使用(和不使用)NavigationController 在 ViewController 之间导航的行为,但我在阅读文章和文档时误解了一些事情,所以我决定问他们。

主要问题是:如果我们在 Storyboard 中有多个 NavigationController 并且想要从一个转到另一个,会发生什么情况? (这可以像我们在普通 VC 之间做的那样使用 segues 来实现,我说的对吗?)

据我了解,NavigationController 代表一堆 ViewController,我们可以在其中弹出和推送这些 VC。所以现在我们将我们的 "location" 从第一个 NavigationController 的 VCs 更改为第二个 NavigationController 的 VCs,接下来会发生什么?第一个堆栈消失了,现在我们只在第二个堆栈中工作?如果是,是否意味着第一个 NavigationController 的 VCs 堆栈已从内存中删除?

也许我完全误解了某些东西,也许没有:)。我很高兴看到您的回复,并希望能向您询问有关导航机制的更多详细问题。

更新

重点是:假设我们有一个(初始)VC,它有两个按钮,代表应用程序的两个独立部分。接下来,我们单击第一个按钮并转到一个 NC 的 RootVC,而不是我们返回初始 VC 单击第二个按钮并转到另一个 NC。当我们回到初始 VC 时,第一个 NC 的堆栈发生了什么,将 "outside" NC 返回到初始 VC 的最佳方法是什么?

更新

我正在尝试了解内存发生了什么以及此刻场景中有哪些 VC,等等。如果我们在场景中有一些额外的 VC 可能绝对不重要,也许我们确实需要它们来更快地在 NC(或只是 VC 之间切换)。所以我只想了解它的实际工作原理。

有意义的是,从现有的 作为模态对话框 呈现一个新的 UINavigationController 及其子视图控制器(这可以通过模态转场来完成).每个导航控制器都有自己的堆栈,当您在对话框中忙碌时,'master' 堆栈保持不变。当您关闭对话框时,您将 return 转到 'master'。

我不确定将导航控制器推到现有控制器上在技术上是否可行。不过,这没有任何意义。

假设您拥有标准应用程序链,您可以在其中在初始导航控制器中推送/弹出视图。然后,假设您有不属于该链的不同视图,例如用户配置文件,您将其呈现为模态视图:

现在顶部导航控制器是初始的,所以你从这里开始,而为了使用第二个,你必须像这样通过 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 然后 运行 它,你会得到 运行time exception 说你做错了。

内存

所有 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
}

希望对您有所帮助!