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

hfz*_*hfz 2 iphone objective-c ios

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

  1. 在init中添加.这个答案的例子
  2. 加入ViewDidLoad.建议在这个答案

目前最好的做法是哪一个?第二个答案似乎是较旧的(2010年),所以我想知道这是一个旧的,不再建议的做法吗?

Tra*_*hor 8

不,永远不要在init中做这样的事情.

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

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


Mik*_*ler 7

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

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

    self.view = view;
}
Run Code Online (Sandbox Code Playgroud)

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