Viewcontroller 堆栈理解问题

Posted

技术标签:

【中文标题】Viewcontroller 堆栈理解问题【英文标题】:Viewcontroller stack understanding issue 【发布时间】:2016-01-13 00:01:33 【问题描述】:

我在理解视图控制器堆栈时遇到了一些严重的问题。 我的应用程序何时会使用堆栈来保存以前的视图控制器?仅当我使用导航视图控制器或任何时候我使用普通视图控制器并在它们之间进行模态分隔时?

所以我只是想知道我是否使用某种链式例程,例如从 vc 1 到 vc 2 以及从 vc 2 回到 vc 1。没有导航控制器,只有模态 segues,没有展开。 我的应用程序是否因为堆栈(每次我运行时都会增长)而出现性能问题,还是没有任何影响?

----更新

所以基本上这是我的问题。如果我通过应用程序的例程,每次执行转换时视图都会堆叠。

【问题讨论】:

【参考方案1】:

UINavigationController 将保留您压入其导航堆栈的任何控制器,直到您将其弹出。

任何UIViewController 都会保留它以模态方式呈现的控制器,直到该子控制器被解除。

在任何一种情况下,每个控制器都至少会消耗一些内存,直到您将其删除。构建不断扩展的控制器堆栈的应用程序可能会遇到许多问题,包括:

    您最终会耗尽内存,速度取决于每个控制器使用多少内存。 如果后台的多个控制器对同一事件做出反应,您可能会看到意想不到的副作用。 如果用户更改控制器“A”实例中的状态,将控制器“B”实例推到其顶部,然后“返回”到添加到顶部的第二个“A”实例,用户可能会感到困惑国家的。由于他们正在查看一个新控制器并查看他们在前一个实例上设置的任何选择、滚动位置、用户输入或其他状态,因此可能会丢失。 包括您在内的开发者可能会害怕接触此应用。

我怀疑如果您查看控制器管理与您呈现给用户的任何视觉隐喻相匹配,每个人都会有更好的体验。

【讨论】:

在哪种情况下,我应该将视图控制器的第二个实例添加到另一个实例上?就在我使用“push”甚至当我使用“modal”的时候? @Tobias 有视图控制器容器,这意味着 UIViewController 可以添加子视图控制器。所以一个父视图控制器可以管理多个子视图控制器。

以上是关于Viewcontroller 堆栈理解问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS:viewController 和 view 的生命周期

推送 ViewController 时清除 navigationController 堆栈

弹出到 NavigationController 堆栈中的特定 ViewController

将 ViewController 添加到现有 UINavigation 堆栈

我在从导航堆栈中删除 ViewController 时遇到问题?

在导航堆栈中重新创建 viewController