1

我将应用程序中的导航从使用 UITabBarController 更改为 u UINavigationController。即以前的解决方案(第 1 版)仅基于 TabBarController - 4 个 ViewControllers(一个简单的 TableView、一个简单的自定义视图和一个带有许多叠加层的 MapView)。第二个版本仅基于 UINavigationController。

在 TabBarController 的情况下,它清晰简单,一切正常,尤其是 MapView。我的意思是:MapView 被加载一次(有大量的叠加层),当我转到另一个视图并返回 MapView 时,MapView 仍然在那里,它的叠加层已经加载并显示(简单检查:调用 MapView 的 viewDidLoad每个应用程序运行一次,我在那里有一些调试消息)。

现在我将导航逻辑更改为 UINavigationController。第一眼一切都很好 - 但是:每次我导航到视图时都会调用 viewDidLoad (对于每个视图)。这很烦人,尤其是在 MapView 的情况下 - 每次都会执行叠加层的加载,这需要一些时间,并且在某些情况下会导致应用程序崩溃。

好的,我的问题:

  1. 它是 NavigationController 的某种“常见”行为吗?

  2. 我可以更改此行为,以便仅调用一次 viewDidLoad 吗?

  3. 还有更多 - 如何影响某些视图的“显示顺序”?

我理解逻辑可能更复杂,但我很感激任何答案或提示;)

一些相关情况:

  • TabBar 和 Navigation 控制器未组合。
  • 我使用故事板,在 UIB 中设计了 segue,在我的代码中没有像 perfomSegue 或 prepareForSegue 这样的手动调用。一键触发到 MapView 的 segue。
  • 我使用 push segues。
  • 我也尝试使用模态序列,但没有改变这种行为。
  • 在视图之间的 segues 中永远不会调用任何 viewDidUnload。
  • 未收到内存警告。
  • 在模拟器和 iPhone 4 上都没有测量到内存泄漏。
  • 我试图构建一个非常简单的临时项目/应用程序,它只关心导航。没有任何编码的控制器和其他视图,只是故事板。这是同样的行为。
  • 当我在一个视图和 MapView 之间快速并定期点击导航按钮和后退按钮时,出现了一个导致应用程序崩溃的问题。在大多数情况下,当我在 MapView 完全显示(即其覆盖)之前点击返回按钮时,应用程序崩溃了。当我添加 1 秒时,它已修复。在 MapView 中 viewDidDisappeared 中的延迟方法调用。我知道,这不是一个公平的解决方案;)
4

1 回答 1

4

AUITabBarControllerUINavigationController基于根本不同的范式。

UITabBarController旨在使UIViewController每个选项卡上的 彼此独立存在,并供用户选择他们想要查看的选项卡。viewDidLoad每个选项卡只被调用一次,UIViewController因为即使用户切换到不同的选项卡,每个选项卡仍然存在于内存中。

UINavigationController是一个堆栈,UIViewControllers其中每个都与自身上方和下方的那个相关。堆栈中的顶部UIViewController始终是用户可见的。当 aUIViewController被压入堆栈时,它viewDidLoad会被调用,因为它正在被加载到内存中。当顶部UIViewController从堆栈中弹出时,它会从内存中卸载,并viewDidUnload在退出时被调用(viewDidUnload在 iOS6 中已弃用并且不会被调用,但控制器仍会从内存中转储)。这就是为什么viewDidLoad每次用户将特定内容UIViewController压入UINavigationController堆栈时都会调用它的原因。

于 2013-03-09T14:36:01.543 回答