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