我遇到了一个奇怪的情况。在我的控制器中,viewDidLoad
被调用之前先调用了init
。这背后是否有任何技术原因?
我遇到了一个奇怪的情况。在我的控制器中,viewDidLoad
被调用之前先调用了init
。这背后是否有任何技术原因?
viewDidLoad
方法在 init
方法中访问 self.view
时被调用(因为此时 self.view
尚未从 nib 中加载,所以该过程似乎很快并且不会返回 nil)。
我知道这篇文章有点老了,但我还是想在任何地方发表我的观点,因为我认为它可能会帮助某些人。
好吧,我也遇到过同样的情况。我以为viewDidLoad方法是在我的视图控制器类的init方法之前被调用的。但实际上发生的不是这样的:流程从init方法开始,但当调用[super init*]时跳转到viewDidLoad方法,所以我的日志消息在viewDidLoad方法中首先显示而不是在我的自定义初始化之前。
我想就是这样。我希望这能节省一些时间给某些人。
[对我的英语表示抱歉]
UITabBarController
的注意事项:我不知道是哪种UIViewController导致了这个问题,但我遇到了与UITabBarController类似的情况。
我认为这可能会对面临UITabBarController
问题的人有所帮助。
据我所知,除了UITabBarController
及其子类之外,所有viewControllers都会在viewDidLoad之前调用init方法。
正如Andrew声称的那样(传送门),UITabBarController
在[super init]
方法内部调用loadView,这将导致调用viewDidLoad
方法。因此,在init完成其任务之前,viewDidLoad
方法将被调用。
如果您需要在viewDidLoad
方法中进行一些设置,您应该在调用[super init]
之后的init方法中进行。
UIViewController
时,你需要使用-initWithNibName:bundle:
方法;而当它从XIB文件中初始化时,XIB加载代码将调用-initWithCoder:
方法。这两个方法中只会被调用其中一个,并且它们一定会在-viewDidLoad
方法之前被调用。-viewDidLoad
绝对不可能首先被调用。不,viewDidLoad消息总是在init之后调用。
你确定init被调用了吗?UIViewController有几个init方法,也许另一个被调用了,让你产生了不同的想法。
如果需要更多信息,请粘贴viewDidLoad和所有init方法的代码,并告诉我们它是如何加载的(即通过代码还是从nib文件中)。
init
方法确实被调用了,但是是在 viewDidLoad
方法之后。对于这个特定的 UIViewController
,只需要分配和初始化它,并将该控制器设置为 UITabBarController
的视图控制器,然后呈现 tabbarController
,这里有什么问题吗? - Sandeep Kumar