Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c UIViewController初始化代码:initWithNibName和viewDidLoad之间的差异_Objective C_Xcode - Fatal编程技术网

Objective c UIViewController初始化代码:initWithNibName和viewDidLoad之间的差异

Objective c UIViewController初始化代码:initWithNibName和viewDidLoad之间的差异,objective-c,xcode,Objective C,Xcode,我认为我们可以在以下两个地方编写init代码 initwithNibName viewDidLoad 有什么区别 我认为initWithNibName发生在viewdidLoad之前,我们必须在initWithNibName中执行一些init操作,这是什么情况呢?将首先调用initWithNibName。这是UIViewController的指定初始化器;换句话说,无论您可能调用什么其他方法来初始化aUIViewController,最终都会在某个地方调用initWithNibName。 例

我认为我们可以在以下两个地方编写init代码

  • initwithNibName
  • viewDidLoad
有什么区别


我认为
initWithNibName
发生在
viewdidLoad
之前,我们必须在
initWithNibName
中执行一些init操作,这是什么情况呢?

将首先调用
initWithNibName
。这是
UIViewController
指定初始化器;换句话说,无论您可能调用什么其他方法来初始化a
UIViewController
,最终都会在某个地方调用
initWithNibName
。 例如,如果只调用
[[UIViewController alloc]init]
,默认行为是尝试加载与视图控制器类同名的nib文件

viewDidLoad
稍后在加载视图后调用。引述:

此方法在视图控制器加载其视图后调用 将层次结构放入内存。无论 视图层次结构是从nib文件加载或通过编程方式创建的 在loadView方法中。您通常重写此方法以执行 对从nib文件加载的视图进行附加初始化

仔细阅读
UIViewController
,以获得更清晰的理解

什么去哪里?

进入
initWithNibName
的代码种类与任何
init
方法的代码种类相同:通常设置任何必要的属性

至于
viewDidLoad
,在这里,您可以将视图层次结构加载到内存后需要运行的代码放在这里。例如,如果希望以编程方式对控制器负责的
UIView
执行某些操作,可以在此处执行,因为在调用
init
时,UIView未加载到内存中


一个常见的错误是,人们试图在
initWithNibName
方法中将消息发送到
self.view
(或子视图),并想知道为什么它没有效果。它没有效果,因为
self.view
在该点为零

另外,您可以说,作为构造函数的init方法是一个很好的点,您可以在这里传递可以在
viewDidLoad
中使用的参数。但由于将首先调用
viewDidLoad
,因此在推送控制器时,您还可以定义自己的setter方法。我更喜欢构造函数的方式,因为它对现有选项有更好的概述;)“将首先调用viewDidLoad”?从来没有先打过电话。Init方法总是首先被调用。哦,我想我现在明白了。第一个意思是“如果条件‘push’为真,它将被调用”。您也可以说“将在控制器之后调用…”^^