如何多次调用 viewDidLoad

Posted

技术标签:

【中文标题】如何多次调用 viewDidLoad【英文标题】:How to make viewDidLoad called more than once 【发布时间】:2013-03-10 11:47:30 【问题描述】:

我知道viewDidLoad 方法在UIViewController 的生命周期中可能会被多次调用。但这怎么可能?如何让它多次调用而不是直接调用它?我试过这样做:

 UIView *view  = [[UIView alloc] initWithFrame:self.view.frame];

view.backgroundColor = [UIColor greenColor];

self.view = view;

虽然我的观点实际上发生了变化,但 viewDidLoad 没有被调用。谁能举个例子?

【问题讨论】:

【参考方案1】:

第一次访问 viewController 的 view 属性时,将使用 loadView 创建视图,然后您将收到 viewDidLoad 调用。

除非视图被销毁,否则您将不会再次收到 viewDidLoad 调用 - 如果您的 viewController 离开屏幕并且 UIKit 决定清除任何不可见的视图,则可能会发生这种情况。因此,下次您访问 view 属性时,它会注意到它不存在并再次使用 loadView 创建一个,然后调用 viewDidLoad

【讨论】:

请注意,从 ios 6 开始,视图将不再被卸载,因此视图控制器的每个实例只会调用一次 loadView / viewDidLoad。 ...根据您对其他答案的cmets,您已经知道了。您可能应该更新答案。 @jrturton 我知道内存不足不会导致视图被清除,所以我只写了“[如果]...UIKit 决定清除”-我不知道是否有UIKit 决定放弃视图的任何其他情况【参考方案2】:

viewWillAppear 方法是一个 UIViewController 方法。为什么不直接打电话?

顺便说一句,没有办法做到这一点,当您将 UIView 分配给您的 self.view 时,如果您没有在 init 或 loadView 或 didLoad 方法中执行此操作..

生命周期是这样的:

初始化 loadView //在此处更改您的视图 viewDidLoad

然后您呈现视图并:

viewWillAppear: viewDidAppear:

如果您想在 uiviewcontroller 生命周期中更改视图,您应该这样做:

UIView *view  = [[UIView alloc] initWithFrame:self.view.frame];

view.backgroundColor = [UIColor greenColor];
[self viewWillAppear:NO]; //set to yes if you are making some kind of animation
self.view = view;
[self viewDidAppear:NO];

将根据UIVIewController生命周期调用will消失和确实消失。

【讨论】:

根据您对我的回答的编辑(其他人拒绝),这不再适用于 iOS 6 On iOS 6, views are never purged and these methods are never called.UIViewController Class Reference 所以你写了非复古兼容的代码?在支持 iOS 5 之前,我的断言仍然正确。您必须编写像 viewDidLoad 这样的代码才能再次调用内存警告。 我从未说过要编写不兼容的代码,而是选择说明 UIKit 是否决定清除视图,而不是明确说明何时可能发生这种情况。 " 如果您的 viewController 离开屏幕并且 UIKit 决定清除任何不可见的视图,则可能会发生这种情况" 这些是你的话。这不是唯一的可能性。 UIKit 也可以销毁并重新创建内存警告视图。不在 iOS 6 中,但如果你编写复古兼容代码,这是真的! UIKit 只会清除屏幕外的视图,无论它是由内存不足警告还是其他一些指标触发的(无关紧要) - 关键是 UIKit 只会清除如果您的视图不在屏幕上并且它决定出于任何原因想要这样做

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

如何防止collectionView:didSelectItemAtIndexPath委托方法被调用多次

如何多次调用动画的函数[重复]

如何修复“多次调用写回调”

我们如何多次调用 NativeBannerAd 的 loadAd 方法?

如何多次顺序调用3个线程?

为啥 Angular 2+ innerHTML 在单个语句中多次调用方法,如何解决这个问题