viewDidLoad被调用两次

8

我的视图控制器中的viewDidLoad方法被调用了两次。一次是由[UIViewController View]调用,另一次是由[UINib instanciateWithOwner:Options]调用的。为什么会出现这种情况?可以如何避免呢?

6个回答

12

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

现在我把这个问题解决了,你的特定问题似乎是一个 bug。请参见 Ned 的答案


好的回答。但我不确定ViewDidLoad会被调用多次,除非有一些隐藏的引用。但我可能是错的。 - uncaught_exceptions
每当需要但不存在视图时,viewDidLoad 将自动调用。使用 controller.view[controller view] 会导致在视图最初为 nil 时调用 viewDidLoad。如果视图未在 instanciateWithOwner 中设置或之后卸载,则可能是再次调用的原因。 - Joe
什么UI行为会触发额外调用viewDidLoad - mfaani

5

1

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

我认为你可能需要使你的代码在ViewDidLoad中幂等。最好确保框架回调方法做出这种假设。


0
在我的情况下,我在viewDidLoad中使用了self.view(一次),同时在我的单元测试中调用了viewDidLoad。这导致了两次调用。然而,当我将[testedViewController viewDidLoad]替换为[testedViewController view]时,双重调用问题就解决了。

0

我的iOS设备经常出现这个问题,有两种可能性。

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

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

希望这可以帮助你。


0

调试显示,@IBInspectable 通过故事板第二次调用了 viewDidLoad。根控制器是 UITabbarController。@IBInspectable 在故事板中设置了选项卡。不确定这是否是 UIKit 的错误,但请尝试检查此问题。如果您的项目设置正确,您永远不需要检查双重调用的 viewDidLoad。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接