我应该以编程方式在init或ViewDidLoad中添加子视图,为什么?

时间:2013-09-05 11:08:37

标签: iphone ios objective-c

我一直在浏览一些答案,我得到两个不同的建议:

  1. 在init中添加。 Example in this answer
  2. 添加ViewDidLoadSuggested in this answer
  3. 目前最佳做法是哪一个?第二个答案似乎是较旧的(2010年),所以我想知道这是一个旧的,不再建议的做法吗?

2 个答案:

答案 0 :(得分:8)

不,永远不要在init中做这些事情。

我viewDidLoad甚至是viewWillAppear,永远不会在init中,因为你的视图当时可能不在那里,当我开始时,我一直在向我发送一些字符串给UILabel而不是那里并且做了应用程序崩溃,但这在模拟器中起作用,因为它比iPhone 3这样的实际设备快得多。

与重置数据和关闭代理相同,不应在dealloc中设置。你认为Dealloc可能不会被调用。您应该在viewWillDissapear或viewWillUnload中设置此类操作。

答案 1 :(得分:7)

对于非基于XIB的视图控制器,正确的位置在-loadView-loadView负责初始化视图控制器的view属性,包括任何子视图。系统将在适当的时间调用此方法。您必须在此方法中为视图控制器的view属性指定一些内容:

 - (void)loadView
{
    UIView *view = ...;
    // create additional views here

    self.view = view;
}

如果您有基于XIB的视图控制器,则文档说不要覆盖-loadView。在这种情况下,您应该在-viewDidLoad中执行其他视图初始化工作。