viewDidLoad被调用两次

时间:2011-08-16 14:15:50

标签: iphone objective-c xcode

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

由于

6 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:5)

这是同样的问题吗?

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

看起来它可能是XCode 4中的一个错误。

答案 2 :(得分:1)

您可能必须检查对象构建机制。如果只有一个nib文件引用了控制器,则不应多次调用此方法。 (除非对象正在重建)。

我认为您可能必须在ViewDidLoad idemPotent中创建代码。确保框架回调方法做出这样的假设总是更好。

答案 3 :(得分:0)

有两种可能性,这个问题经常发生在我的iOS设备上。

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

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

希望这有帮助。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

调试这表明viewDidLoad 被@IBInspectable 第二次调用。根控制器是一个 UITabbarController。 @IBInspectable 正在设置故事板中的选项卡。不确定这是否是 UIKit 错误,但请尝试检查。如果您的项目设置正确,则永远不需要检查 viewDidLoad 是否有双重调用。