我知道有很多类似的问题,但我找不到专门解决此问题的问题。
为什么self.navigationController
在viewDidLoad
中调用时为空,但在从外部viewDidLoad
调用时更正?
这是NSLog(@"%@",self.navigationController);
的输出。第一个是在viewDidLoad
中调用的,第二个我使用调用NSLog(@"%@",self.navigationController);
的方法向界面添加了一个按钮:
NavApp[31524:11003] (null)
NavApp[31524:11003] <UINavigationController: 0x6e21190>
我知道这种行为必须有一些简单的解释,我只是好奇它是什么。谢谢!
答案 0 :(得分:64)
首次访问该控制器上的-view
方法/属性时,将加载视图控制器的视图。加载视图后,将调用viewDidLoad
方法。这很简单。您还必须记住,如果视图在屏幕外时收到内存警告,则可以多次加载/卸载视图。
所以viewDidLoad
并不意味着您的视图控制器已插入导航控制器。在将视图控制器推送到导航控制器的过程中,将访问和加载其view
,但这将在整个推送完成之前发生。因此,在viewDidLoad
属性更新之前,navigationController
显然已被调用。
在将视图控制器推送到导航控制器之前,您还必须考虑代码的其他部分可能正在访问视图控制器的视图。
所以viewDidLoad
是做你正在做的事情的错误地方。您可能希望使用viewDidAppear:
之类的方法,因此您知道视图控制器的视图在调用时是视图层次结构的一部分。