【问题标题】: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>

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

【问题讨论】:

标签: iphone objective-c ios ipad


【解决方案1】:

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

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

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

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

【讨论】:

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