2011-08-16 111 views
2

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

感谢

回答

6

你把viewDidLoad内部的任何代码应能与任何问题,运行多次。如果您的代码只需要为您的控制器运行一次,请使用-awakeFromNib。原因是因为视图控制器的视图可以卸载并加载多次。 viewDidLoad中的代码应该只修改UI以反映当前状态。

现在我明白了,你的特定问题看起来是一个错误。请参阅Ned's answer

+0

好答案。但我不确定有关ViewDidLoad会被多次调用,除非有一些隐藏的引用。但我可能是错的。 –

+0

viewDidLoad将在需要视图时自动调用,但不在那里。如果视图最初为零,则使用'controller.view'或'[controller view]'会导致viewDidLoad被调用。如果未在instanciateWithOwner中设置视图,或者之后卸载视图,则可能是它再次被调用的原因。 – Joe

1

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

我想你可能必须在ViewDidLoad idemPotent中创建你的代码。确保框架回调方法做出这个假设总是比较好的。

0

有两种可能性,因此这个问题在我的iOS设备经常发生。规则#1:不要在[init]函数中调用任何与视图相关的设置,所有视图相关的设置必须在viewDidLoad和viewWillAppear中完成。

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

希望这会有所帮助。

0

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