在我正在从事的项目中,我有一个视图控制器,该控制器重写了loadView()
方法,以编程方式设置视图层次结构。我很好奇,对于此方法与viewDidLoad()
相比有什么要求,或者在loadView()
已被覆盖时后者是否多余。是否有无法完成的事情,例如在loadView()
的最后,应该推迟到调用viewDidLoad()
之前,还是仅仅是出于偏爱的问题?
编辑:这个问题的最初措辞有些基于意见。需要澄清的是,我对是否有参考资料表明在loadView()
中无法使用的viewDidLoad()
中无法使用的方法存在技术限制感到关注。
答案 0 :(得分:0)
loadView
的文档可以很好地回答您的问题:
如果使用Interface Builder创建视图并初始化视图控制器,则不得覆盖此方法。
您可以重写此方法以便手动创建视图。如果选择这样做,请将视图层次结构的根视图分配给view属性。您创建的视图应该是唯一的实例,并且不应与任何其他视图控制器对象共享。您对此方法的自定义实现不应调用super。
如果要对视图执行其他任何初始化,请在viewDidLoad()方法中执行。
换句话说,只有严格用代码编写视图控制器时,才覆盖loadView
-请勿使用笔尖或情节提要。然后,仅当您有理由使控制器的基本视图不是默认的普通UIView
时,才可以使用。请记住,在实现中必须不要调用super.loadView()
。
我将使用viewDidLoad
创建和设置要添加到视图控制器基本视图的任何子视图(无论是否使用loadView
)。另外,将viewDidLoad
用于在加载视图之前无法完成的任何其他设置。
从技术上讲,如果您覆盖loadView
来设置自定义基本视图,则可以将viewDidLoad
中可能放置的所有内容放入loadView
中。但是我仍然要分开责任。仅使用loadView
(如果需要)来创建和设置控制器的基本视图。根据需要使用viewDidLoad
创建其他子视图以及任何其他控制器设置。
还请记住,某些视图控制器的初始设置属于初始化程序。但是此类代码无法引用任何视图。