27

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

为什么self.navigationController调用时为null viewDidLoad,但从外部调用时正确viewDidLoad

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

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

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

4

1 回答 1

78

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

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

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

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

于 2012-06-11T15:06:55.610 回答