【问题标题】:Should I programmatically add subviews in init or ViewDidLoad, and why?我应该以编程方式在 init 或 ViewDidLoad 中添加子视图,为什么?
【发布时间】:2013-09-05 11:08:37
【问题描述】:

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

  1. 添加初始化。 Example in this answer
  2. 添加ViewDidLoadSuggested in this answer

哪一个是当前的最佳做法?第二个答案似乎更旧(2010 年),所以我想知道它是否是一个旧的、不再建议的做法?

【问题讨论】:

  • 这取决于您的要求...第二个答案对一切都有意义。

标签: 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 中进行额外的视图初始化工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      相关资源
      最近更新 更多