为啥 viewDidLoad 中的 self.navigationController 为空?

Posted

技术标签:

【中文标题】为啥 viewDidLoad 中的 self.navigationController 为空?【英文标题】:Why is self.navigationController null in viewDidLoad?为什么 viewDidLoad 中的 self.navigationController 为空? 【发布时间】:2012-06-11 14:55:14 【问题描述】:

我知道有很多类似的问题,但我找不到专门解决这个问题的问题。

为什么在viewDidLoad 中调用self.navigationController 时为空,但从viewDidLoad 外部调用时正确?

这是我从NSLog(@"%@",self.navigationController); 输出的第一个在viewDidLoad 中调用,第二个我使用调用NSLog(@"%@",self.navigationController); 的方法向界面添加一个按钮:

NavApp[31524:11003] (null)
NavApp[31524:11003] <UINavigationController: 0x6e21190>

我知道这种行为必须有一些简单的解释,我只是好奇它是什么。谢谢!

【问题讨论】:

你是先调用[super viewDidLoad]吗? 这里有一个类似的问题:***.com/questions/7497183/…。接受的答案与下面的 Mike 相同,但深度稍差。 【参考方案1】:

当您第一次访问该控制器上的 -view 方法/属性时,将加载视图控制器的视图。加载视图后,将调用 viewDidLoad 方法。这很简单。您还必须记住,如果在视图离开屏幕时收到内存警告,则可以多次加载/卸载视图。

所以viewDidLoad 并不意味着您的视图控制器已插入导航控制器。在将视图控制器推送到导航控制器的过程中,将访问并加载其view,但这会发生在整个推送完成之前。所以viewDidLoad 显然是在navigationController 属性更新之前被调用的。

在将视图控制器推送到导航控制器之前,您还必须考虑到代码的其他部分可能正在访问视图控制器的视图。

所以viewDidLoad 是做你正在做的事情的错误地方。您可能想使用viewDidAppear: 之类的方法,这样您就知道视图控制器的视图在调用时是视图层次结构的一部分。

【讨论】:

是的,我把我的代码移到了viewWillAppear:,它工作正常。我只是好奇其中的原因。你的帖子清除了它。谢谢。 我将我的代码移到了viewWillAppear:,但看起来我仍然遇到了一些崩溃。有谁知道navigationController 什么时候永远不会为零? 请注意,如果您的视图控制器是尚未推送到的视图层次结构的一部分(例如,附加到 UIPageViewController),navigationController 可能仍然是 nil 中的 nil导航控制器。如果您希望 navigationController 属性在调用 viewDidAppear 时返回一个对象,则需要确保您以正确的顺序设置视图控制器堆栈。 刚刚遇到同样的问题,变得非常沮丧。谢谢你把事情说清楚!

以上是关于为啥 viewDidLoad 中的 self.navigationController 为空?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 nib 文件中的 UITableViewCell(加载并添加到堆栈)在 viewDidAppear 中为零,但在 viewDidLoad 中没问题?

为啥“numberOrRowsInSection”在“viewDidLoad”中途被调用?

为啥在 ViewDidLoad 中没有设置 GLKView 的 DrawableWidth?

为啥 viewDidLoad 在 vi​​ewWillAppear 之前被调用? [复制]

为啥在 viewDidLoad 中添加子视图不起作用

为啥 viewDidLoad() 中不存在 TableView 的 FooterView 以及如何解决?