【问题标题】:ios - Navigation between multiple NavigationControllersios - 多个导航控制器之间的导航
【发布时间】:2015-07-22 09:05:31
【问题描述】:

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

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

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

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

更新

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

更新

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

【问题讨论】:

    标签: ios swift segue viewcontroller


    【解决方案1】:

    想象一下,您有标准的应用程序链,您可以在初始导航控制器中推送/弹出视图。然后,假设您有不属于该链的不同视图,例如用户个人资料,您将其呈现为模态视图:

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

    内存

    无论您如何呈现它们,所有 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
    }
    

    希望对你有帮助!

    【讨论】:

    • 感谢您的详细回答,现在这对我来说很有意义!正如我从 [唯一的区别是现在你不需要第二个导航控制器 - 所以你不需要将 push segue 连接到红色 NC] 和 [所有 VC 都留在内存中,无论你如何呈现它们。] 应用程序中根本不需要多个 NC,我们只创建一个 NC 并在其中完成所有事情,不是吗?当我们在应用程序中确实需要多个 NC 时,您能举个例子吗?
    • 是的,如果你只是推送和弹出 VC,一个导航控制器就足够了。我猜想使用多个导航控制器的最佳示例是当您在应用程序中留下更改您的根视图的菜单时(因此您转到一些列表,还有联系表单等。然后您有多个用户交互的初始点 -并且您也将拥有相同数量的 NC :)
    • 在我对@Glorfindel 的一个 cmets 中,我谈到了一个 VC(初始),它有两个按钮,可以访问不同的应用程序部分(某种左面板;D)。在这种情况下,从初始 VC 转到 NC 之一后,我们将最后一个作为根视图,对吗?其他的会发生什么(例如,当我们在这些 NC 之间切换时)?以及如何以正确的方式从一个 NC 的 VC 转到另一个 NC 中的特定 VC? (只使用 show segue?)
    • 关于 VC 导航机制的问题太多了,但过去几周让我发疯了;D
    • 基本上,一般规则:如果您通过推送呈现控制器,则不需要导航控制器(否则抛出异常)。如果您呈现模态视图,这是您的决定(基于您是否需要推动该模态)。如果您需要更改导航控制器的 .topViewController,最好使用新的 NC。其他情况是次要的,但是当您自己尝试几次时,您就会明白,因为做什么和不做什么会感觉很自然。如果它需要大量的工作,你通常做错了:)
    【解决方案2】:

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

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

    【讨论】:

    • 据我了解,它会将一个 NavigationController 添加到另一个的堆栈中?我不需要这样的行为(并且无法想象它可以在哪里使用)。关键是:假设我们有一个(初始)VC,带有代表应用程序两个独立部分的按钮。接下来,我们单击第一个按钮并转到一个 NC 的 RootVC,而不是回到我们最初的 VC 点击第二个按钮并转到另一个 NC。当我们回到初始 VC 时,第一个 NC 的堆栈发生了什么?将“外部”NC 转到初始 VC 的最佳方式是什么?
    • 你想要的行为让我想起了UITabBarController,它维护了几个子视图控制器(可以是导航控制器)。在这种情况下,标签栏控制器会维护每个导航控制器的状态。
    • 在这种情况下,应用程序有一个由这些 NC 的两个堆栈组成的堆栈,或者堆栈是分开的,其中只有一个(当前)留在内存中,然后它将被释放而我们把它改回第一个?
    • 如果我们不在堆栈中,我希望 NC 退出应用程序内存。而且 tabcontroller 也不适合我,我们怎么能不使用它呢?我想这应该很简单,我知道如何使用 segues,但我试图了解内存发生了什么,以及目前场景中有哪些 VC,等等。如果我们在场景中有一些额外的 VC,也许这绝对不重要,也许我们确实需要它们来更快地在 NC(或只是 VC)之间切换。所以我只想了解它实际上是如何工作的。
    猜你喜欢
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多