是否在 UITabBarController 中多次调用 viewDidLoad?

Posted

技术标签:

【中文标题】是否在 UITabBarController 中多次调用 viewDidLoad?【英文标题】:Does viewDidLoad get called more than once in UITabBarController? 【发布时间】:2013-10-10 09:37:33 【问题描述】:

我在我的应用程序中使用 SWRevealViewController(以获取滑出侧面板),但是每当用户导航到另一个 viewController(如“设置”)并返回时,一切都会重置。我知道这是故事板的正常行为,因为每次都会实例化一个新的 VC 并调用 viewDidLoad。我试图通过将 VC 存储在 AppDelegate 中的数组中然后返回到原始 viewController 来解决这个问题,这阻止了 viewDidLoad 在最初重新呈现原始 VC 时被调用,但我仍然发现它在移动时被随机调用veiwcontroller 的,重置我的所有属性等。在研究中,Apple 文档确实说不要假设 viewDidLoad 只会被调用一次。

当我正在考虑放弃 SWRevealViewController 并使用它来代替它时,切换选项卡时这种行为在 UITabBarController 中是否明显,如果它不那么令人头疼的话。

我应该以不同的方式处理这个问题,即。在 NSUserDefaults 中存储“状态”并在 viewDidLoad 上恢复?

提前致谢。

【问题讨论】:

NavigationController 和 TabBar 的行为不同。在导航控制器中,如果您有 1(root)、2,3 视图控制器并且位于 viewController1,那么您只有 1。如果您转到 2,那么您有 1,2 如果您返回 1,您有 1(2消失了,即设置为零),如果你回到 2,那么 2 是从头开始创建的。如果您选择 1,2,3,那么您将拥有全部 3。如果这是在 tabBar 中,那么无论是否在屏幕上,您始终拥有 1,2,3 【参考方案1】:

viewDidLoad 仅在 UIViewController 首次加载到内存时被调用一次。这是您要实例化任何实例变量并构建在此 UIViewController 的整个生命周期中存在的任何 UIViews 的地方。

UITabBarController 中,UIViewControllerviewdidLoad 也会在您切换标签时被调用一次。

【讨论】:

1) 是什么让它再次加载?如果我们的内存不足并且应用程序本身删除了视图控制器怎么办......下次打开时会调用viewDidLoad 吗? 2) 视图控制器如何创建也没关系吗?即,如果您每次访问时都天真地创建 viewController? 你好,请问我每次点击标签时应该使用哪种方法触发?? @NadeemKhoury:你可以使用UITabBarControllerDelegate 方法。【参考方案2】:

viewDidLoad() 方法只被调用一次。它是循环的一个组成部分。

调用它然后将相应的UIViewController 类加载到内存中。

是的,如果您想初始化任何属性或访问和修改NSUserDefaults,可以而且应该在viewDidLoad 方法中完成。

对于您的应用,每当用户在不同的UIViewControllers 之间切换时,都会为每个目标UIViewController 调用viewDidLoad 方法。

另外,正如正确指出的那样,它也会在内存警告的情况下被调用。

【讨论】:

内存警告会导致它被再次调用。 但这无关紧要。这没关系。诚然,我应该在我的回答中承认这一点,但至于他的应用程序,我认为这不是什么大问题。你不觉得吗?因为他在谈论可重新创建的变量。 如果我的应用程序收到内存警告,我会感到惊讶,这只是非常基本的,但我会对此进行测试。我会尝试用我的代码更新我的原始帖子。 - viewDidUnload 的文档说,在 ios 6 及更高版本中,“视图不再在内存不足的情况下被清除”。但是,Apple may still call viewDidLoad more than once.

以上是关于是否在 UITabBarController 中多次调用 viewDidLoad?的主要内容,如果未能解决你的问题,请参考以下文章

是否有像 UITabBarController 一样工作的 iOS 滑动菜单控制器?

保持 UITabbarController 在每个视图中可见

UITabbarController 动态更改项目

将额外的 UITabbarItem 添加到 UITabbarController

双击UITabBarController时防止自动popToRootViewController

一起使用 UITabBarController 和 UINavigationController