【问题标题】:Should I programmatically add subviews in init or ViewDidLoad, and why?我应该以编程方式在 init 或 ViewDidLoad 中添加子视图,为什么?
【发布时间】:2013-09-05 11:08:37
【问题描述】:
【问题讨论】:
标签:
iphone
ios
objective-c
【解决方案1】:
不,永远不要在 init 中做这样的事情。
我 viewDidLoad 甚至 viewWillAppear,从来没有在 init 中,因为你的视图当时可能不在那里,当我开始时,它一直发生在我身上,我正在为一个不存在的 UILabel 设置一些字符串并制作应用程序崩溃,但这在模拟器中有效,因为它比 iPhone 3 等实际设备快得多。
与重置数据和关闭委托相同,不应在 dealloc 中设置。当您认为会调用时,可能不会调用 Dealloc。您应该在 viewWillDissapear 或 viewWillUnload 中设置此类操作。
【解决方案2】:
对于非基于 XIB 的视图控制器,正确的位置在 -loadView。 -loadView 负责初始化视图控制器的 view 属性,包括任何子视图。系统会在适当的时候调用这个方法。您必须在此方法中为视图控制器的 view 属性分配一些内容:
- (void)loadView
{
UIView *view = ...;
// create additional views here
self.view = view;
}
如果你有一个基于 XIB 的视图控制器,文档说明不要覆盖 -loadView。在这种情况下,您应该在-viewDidLoad 中进行额外的视图初始化工作。