ios - 多个NavigationControllers之间的导航

时间:2015-07-22 09:05:31

标签: ios swift segue viewcontroller

我试图理解使用NavigationController在(和没有)ViewControllers之间导航的行为,并且我在阅读文章和文档时误解了一些内容,所以我决定问他们。

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

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

也许我完全误解了某些东西或者可能不是:)。我很乐意看到您的回复,并希望向您询问有关导航机制的更多详细信息。

更新

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

更新

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

2 个答案:

答案 0 :(得分:7)

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

enter image description here

现在顶部导航控制器是初始的,所以你从这里开始,而为了使用第二个,你必须通过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
}

希望它有所帮助!

答案 1 :(得分:0)

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

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