loadView()和viewDidLoad的职责划分

时间:2019-01-30 15:19:39

标签: ios uiviewcontroller

在我正在从事的项目中,我有一个视图控制器,该控制器重写了loadView()方法,以编程方式设置视图层次结构。我很好奇,对于此方法与viewDidLoad()相比有什么要求,或者在loadView()已被覆盖时后者是否多余。是否有无法完成的事情,例如在loadView()的最后,应该推迟到调用viewDidLoad()之前,还是仅仅是出于偏爱的问题?

编辑:这个问题的最初措辞有些基于意见。需要澄清的是,我对是否有参考资料表明在loadView()中无法使用的viewDidLoad()中无法使用的方法存在技术限制感到关注。

1 个答案:

答案 0 :(得分:0)

loadView的文档可以很好地回答您的问题:

  

如果使用Interface Builder创建视图并初始化视图控制器,则不得覆盖此方法。

     

您可以重写此方法以便手动创建视图。如果选择这样做,请将视图层次结构的根视图分配给view属性。您创建的视图应该是唯一的实例,并且不应与任何其他视图控制器对象共享。您对此方法的自定义实现不应调用super。

     

如果要对视图执行其他任何初始化,请在viewDidLoad()方法中执行。

换句话说,只有严格用代码编写视图控制器时,才覆盖loadView-请勿使用笔尖或情节提要。然后,仅当您有理由使控制器的基本视图不是默认的普通UIView时,才可以使用。请记住,在实现中必须不要调用super.loadView()

我将使用viewDidLoad创建和设置要添加到视图控制器基本视图的任何子视图(无论是否使用loadView)。另外,将viewDidLoad用于在加载视图之前无法完成的任何其他设置。

从技术上讲,如果您覆盖loadView来设置自定义基本视图,则可以将viewDidLoad中可能放置的所有内容放入loadView中。但是我仍然要分开责任。仅使用loadView(如果需要)来创建和设置控制器的基本视图。根据需要使用viewDidLoad创建其他子视图以及任何其他控制器设置。

还请记住,某些视图控制器的初始设置属于初始化程序。但是此类代码无法引用任何视图。