ViewDidLoad 没有被调用

Posted

技术标签:

【中文标题】ViewDidLoad 没有被调用【英文标题】:ViewDidLoad does not get called 【发布时间】:2013-09-11 07:19:01 【问题描述】:

我正在为 iPhone 和 iPad 开发一个应用程序。该应用程序有一个 TabBar 在 ViewControllers 之间切换。我知道,当为这两种设备开发应用程序时,我所要做的就是再次为 iPad 创建 Storyboard 项目,并将属性与我已经拥有的 ViewController 连接起来,即 FirstViewController 对于 iPhone 和 iPad 应用程序是相同的。

在 iPhone 应用程序中有三个选项卡,但由于 iPad 的屏幕尺寸更大,我希望 iPad 版本有两个选项卡。所以我想为 iPad 应用合并 SecondViewController 和 ThirdViewController。所以我决定继承UIViewController并将其命名为MyViewController。在 MyViewController 内部有 SecondViewControllerThridViewController 的代码。

在模拟器中,我可以看到MyViewController 视图的背景图像和情节提要项目。问题是在MyViewController 类上没有调用viewDidLoad 方法(我在[super viewDidLoad] 之后有一个NSLog 语句)。我在 Idendity Inspector 的故事板中检查了该类是 MyViewController。还尝试使用新的子类创建一个全新的 ViewController,但对于那个新的 ViewController,方法 viewDidLoad 方法没有被调用。

【问题讨论】:

对不起这个愚蠢的问题,我自己找到了答案。如果有人想知道这是因为当我运行该应用程序时,我使用 iPhone Simulator 完成了它,然后在“硬件”菜单中将设备更改为 iPad。但是当我将模拟器设置为 iPad 模拟器然后运行应用程序时,一切正常。 【参考方案1】:

当您移动到 ​​controller-B 时,标签栏控制器不会释放 controller-A,反之亦然。它们被分配一次,因此您看不到 viewDidLoad 时标签被打乱了。

您可能需要检查viewWillAppear 方法来查看是否调用了视图控制器!

【讨论】:

我不是指在选项卡之间随机播放,我的意思是当我第一次单击选项卡栏并加载 MyViewController 时,不会调用 viewDidLoad 方法。我知道它只被调用一次。 在您添加 SecondViewController 和 ThridViewController 的位置分享您的 MyViewController 代码 - 这可能有助于推进它。 其实我找到了soultion并把它贴在了cmets上。但是我将代码添加到MyViewController 的方式只是复制粘贴。我只需要 iPad 版本的 ViewController 类,它包含与 iPhone 版本中的 SecondViewControllerThirdViewController 相同的代码。【参考方案2】:

您可以使用这些生命周期事件:

响应视图事件

– viewWillAppear:
– viewDidAppear:
– viewWillDisappear:
– viewDidDisappear:
– viewWillLayoutSubviews
– viewDidLayoutSubviews

- (void)viewDidAppear:(BOOL)animated

viewDidAppear 将在您的视图再次可见时被调用

【讨论】:

以上是关于ViewDidLoad 没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

UIImagePickerController 在调用 alloc init 时真的很慢

awakeFromNib 被调用,viewDidLoad 未被调用

理论知识整合笔记

iOS:如何知道 viewDidLoad 是不是被调用?

为啥“numberOrRowsInSection”在“viewDidLoad”中途被调用?

viewDidLoad 被调用两次