viewDidLoad 被调用两次

Posted

技术标签:

【中文标题】viewDidLoad 被调用两次【英文标题】:viewDidLoad is called twice 【发布时间】:2011-08-16 14:15:49 【问题描述】:

我在视图控制器中的viewDidLoad 被调用了两次。一次是[UIViewController View],第二次是[UINib instanciateWithOwner:Options]。为什么会这样?可以预防吗?

【问题讨论】:

【参考方案1】:

您放在viewDidLoad 中的任何代码都应该能够多次运行而不会出现任何问题。如果您的代码只需要为您的控制器运行一次,请使用-awakeFromNib。原因是因为视图控制器的视图可以多次卸载和加载。 viewDidLoad 内部的代码应该只修改 UI 以反映当前状态。

现在我已经解决了这个问题,您的特定问题看起来是一个错误。见Ned's answer。

【讨论】:

好答案。但我不确定 ViewDidLoad 是否会被多次调用,除非有一些隐藏的引用。但我可能错了。 viewDidLoad 将在需要视图但不存在时自动调用。如果视图最初为 nil,则使用 controller.view[controller view] 将导致调用 viewDidLoad。如果视图没有在 instanciateWithOwner 中设置,或者之后被卸载,则可能是再次调用它的原因。 什么 UI 行为会触发对 viewDidLoad 的额外调用?【参考方案2】:

这是同样的问题吗?

Why is viewDidLoad called twice when the rootViewController property of UIWindow is set?

看起来这可能是 XCode 4 中的错误。

【讨论】:

【参考方案3】:

您可能需要检查对象构建机制。如果只有一个 nib 文件引用了控制器,那么这个方法不应该被多次调用。 (除非对象正在重建)。

我认为您可能必须在 ViewDidLoad idemPotent 中编写代码。最好确保框架回调方法做出这种假设。

【讨论】:

【参考方案4】:

有两种可能,我的 ios 设备经常出现此问题。

规则 #1:不要在 [init] 函数中调用任何与视图相关的设置,所有视图相关的设置都必须在 viewDidLoad 和 viewWillAppear 中完成。

规则 #2:检查 viewDidLoad 和 viewWillAppear,它们是否调用了正确的超级函数?例如 viewDidLoad -> 超级 viewDidLoad 等等。

希望这会有所帮助。

【讨论】:

【参考方案5】:

就我而言,我在单元测试中调用 viewDidLoad 时在 viewDidLoad 中使用了 self.view(一次)。这导致了两个电话。但是,当我将[testedViewController viewDidLoad]替换为[testedViewController view]后,双重调用问题就消失了。

【讨论】:

【参考方案6】:

对此进行调试表明,@IBInspectable 再次调用了 viewDidLoad。根控制器是一个 UITabbarController。 @IBInspectable 正在设置情节提要中的选项卡。不确定这是否是 UIKit 错误,但请尝试检查。如果您的项目设置正确,则永远不需要检查 viewDidLoad 是否有双重调用。

【讨论】:

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

Xcode 4 - viewDidLoad 问题

ViewWillAppear 被调用两次

当在 UISearchBar 中粘贴搜索字段时,searchBar textDidChange 被调用两次

UIImagePickerController 在调用 alloc init 时真的很慢

awakeFromNib 被调用,viewDidLoad 未被调用

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