为什么self.navigationController在viewDidLoad中为null?

时间:2012-06-11 14:55:15

标签: iphone objective-c ios ipad

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

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

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

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

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

1 个答案:

答案 0 :(得分:64)

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

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

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

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