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】:您可以使用viewWillAppear
或viewDidAppear
(最后一个在第一个之后调用)。 ViewDidLoad 仅在构造 ViewController 时调用。然后,由于您让它存在于导航堆栈中,因此不再调用它。
更多信息请关注thread on ***。
编辑
随着您的编辑,整个问题变成了一个不同的问题。如果您希望每次显示您的 ViewController 时都调用一个委托,viewWillAppear
或 viewDidAppear
就是答案。
在我看来,你把事情复杂化了。据我了解,您正在更改 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顶部