我面临一个奇怪的情况。在我的控制器中,viewDidLoad
在init
之前调用。这背后有任何技术原因吗?
答案 0 :(得分:48)
在viewDidLoad
方法中访问self.view
时正在调用init
方法(因为self.view
尚未从笔尖加载,因此进程似乎已紧固它没有返回nil)。
答案 1 :(得分:14)
我知道这是一个有点旧的帖子,但我会在任何地方发表我的观点,因为我认为它可以帮助某人。
好吧,我一直处于同样的境地。我认为viewDidLoad是在我的视图控制器类中的init方法之前调用的。但真正发生的事情并非如此:流程在init方法上启动,但在调用[super init *]时跳转到viewDidLoad,因此viewDidLoad方法中的日志消息首先显示在我的自定义初始化中。
我认为就是这样。我希望这能节省一些时间。
[抱歉我的英文]
答案 2 :(得分:6)
我不知道viewController是什么类型的,但是我遇到了类似UITabBarController的情况。
我认为用UITabBarController可以帮助另一个人面对它
据我所知,所有viewControllers在viewDidLoad之前调用init,除了UITabBarController及其子类。
正如Andrew声称here,UITabBarControllers在[super init]
方法中调用loadView,这导致对viewDidLoad的调用。因此,在init完成其工作之前将调用viewDidLoad方法
如果你在viewDidLoad中设置了一些东西,你应该在调用[super init]
之后在init方法中进行设置。
答案 3 :(得分:3)
从代码初始化UIViewController
时,使用-initWithNibName:bundle:
,而当从XIB初始化时,XIB加载代码将调用-initWithCoder:
。将调用这两种方法中的一种,并且它们肯定会在-viewDidLoad
之前被调用。
除非你自己调用它(你永远不应该这样做),否则不可能首先调用-viewDidLoad
。
答案 4 :(得分:0)
不,在 init之后始终将viewDidLoad消息称为。
你确定会调用init吗?有几种初始化方法,特别是对于UIViewController,可能会调用另一种方法,而不是让你以不同的方式思考。
如果您需要更多信息,请粘贴viewDidLoad代码和所有init方法,并告诉我们如何加载(即使用代码)或从笔尖加载。
答案 5 :(得分:0)
如果从主nib文件加载ViewController,则很可能是调用初始化控制器的initWithCoder。