ViewDidLoad 在导航时只调用一次

Posted

技术标签:

【中文标题】ViewDidLoad 在导航时只调用一次【英文标题】:ViewDidLoad call only one time in time of navigation 【发布时间】:2014-01-07 09:42:12 【问题描述】:

我有视图控制器。我已经在 appdelegate.m 文件中创建了它的对象,因为我想在 poptoviewcontroller 方法中使用该视图控制器。现在,一旦我在 appdelegate 文件中创建了它的对象,并且当我推送该视图控制器时,它只会调用 viewdidload 1 次。但从第二次开始,它不再调用 viewdidload。我有一些组件,我想在每次控制器加载时加载。该怎么办??有没有其他方法可以在 popToViewController 方法中使用 viewcontroller 而无需在 appdelegate.m 文件中创建其对象

我有 4 个视图控制器 A、B、C、D。 我正在从 A 导航到 B。我在 B 中有一些组件,我正在将其加载到 viewdidLoad 中。现在从 A 到 B 流,我从组件的服务器中获得价值。并显示在 B 中。现在如果用户想要更改值,那么他将从 B 重定向到 C 以更改 B 组件值。并且有时他会重定向到 D 并且从 D 我用 B 组件值弹出到 B。现在,如果我将在 viewwillappear 中编写我的 B 代码,那么当我从 C 返回到 B 时,它将加载我在从 A 导航到 B 时获得的值。

【问题讨论】:

发生这种情况是因为对象的一个​​实例仅加载到内存中一次。为了提高您在 ios 中视图控制器及其生命周期的技能,请访问:developer.apple.com/library/ios/featuredarticles/… 【参考方案1】:

您可以使用viewWillAppearviewDidAppear(最后一个在第一个之后调用)。 ViewDidLoad 仅在构造 ViewController 时调用。然后,由于您让它存在于导航堆栈中,因此不再调用它。

更多信息请关注thread on ***。

编辑

随着您的编辑,整个问题变成了一个不同的问题。如果您希望每次显示您的 ViewController 时都调用一个委托,viewWillAppearviewDidAppear 就是答案。

在我看来,你把事情复杂化了。据我了解,您正在更改 AppDelegate 中的 B ?如果是这样,当您来自 C 并在viewWillAppear 中更新您的状态时,我看不出 B 有任何问题。如果您在 AppDelegate 中有某种指向 B 的指针并且您更改了它,那么 viewWillAppear 应该没有任何问题。

对于您的问题,您可以有多种解决方案,这完全取决于您的具体情况,但我建议您更好地分离模型。您可以创建一个包含 B 数据的单例,并在 viewWillAppear 中获取该数据并显示它。然后 C 和 D 只对该单例执行更改。

【讨论】:

从导航视图控制器我可以导航到另一个视图控制器以更改组件的值。因此,如果我使用 viewwillappear 那么它不会保持我的价值。 这是真的,除非您的 UIViewController 因内存限制而被卸载。在这种情况下,viewDidLoad 将被再次调用。 @vivek 如果您有特定问题,您还需要更具体地提出问题。也许给我们举个例子? @TiagoAlmeida 看我的解释。 @vivek 编辑了我的答案,但这是您正在做的另一个问题。这与您的应用程序的架构有关,而不是与 viewController 生命周期有关。你的问题误导了人们(和谷歌)。【参考方案2】:

viewDidLoad 方法只在类的初始化时调用,如果你有一些任务要一遍又一遍地在屏幕上出现而不是使用 viewWillAppear 或者 viewDidAppear 方法。

【讨论】:

以上是关于ViewDidLoad 在导航时只调用一次的主要内容,如果未能解决你的问题,请参考以下文章

理论知识整合笔记

首先导航,然后在 iphone 应用程序中调用 viewDidLoad

添加滚动视图时,所有视图都显示在导航栏后面的self.view顶部

如何多次调用 viewDidLoad

推送 viewController 时未调用 viewDidLoad

尽量不要在viewWillDisappear:方法中移除通知