iOS:isMovingToParentViewController不能按预期工作

我的设置很简单,我的问题与这个不太一样。 不过为了更好的解释,我已经在这里发布了:

NavController -> VC1 -> VC2 

VC1是NavController的根视图控制器。 VC2可以通过VC1的Push segue来访问。

我想在VC1中检测是否:

它直接作为根视图控制器(通过Push)出现,因为VC2被popup

我阅读下面的文档应该告诉我,如果以后是真的。

 isMovingToParentViewController == NO 

不过情况并非如此,以上情况始终是真的。 这意味着,(self.isMovingToParentViewController == NO)总是发生。

这是我的代码:

 - (void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.navigationController.navigationBarHidden = YES; //pushed to stack if (self.isMovingToParentViewController == YES) { //First time } else //popped off { //via Pop from VC2 } } 

viewDidAppear也是如此。

对于事实检查,我在开始时加上断点,并检查以下所有内容都是否为假:

 ([self isMovingFromParentViewController]) ([self isMovingToParentViewController]) ([self isBeingPresented]) ([self isBeingDismissed]) 

发生什么事? 我的故事板上有什么我疯狂的东西吗? 请帮忙…

不幸的是,isMovingToParentViewController对于根视图控制器是不正确的,所以我通常用BOOL来处理这种情况,

 @implementation ViewController { BOOL isFirstAppearance; } - (void)viewDidLoad { [super viewDidLoad]; isFirstAppearance = YES; } -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; if (isFirstAppearance) { NSLog(@"root view controller is moving to parent"); isFirstAppearance = NO; }else{ NSLog(@"root view controller, not moving to parent"); } } 

由于看起来isMovingToParentViewController只是当viewController被推入到导航堆栈,而不是设置为初始rootViewController设置,我会build议使用以下内容:

  if([self.navigationController.viewControllers containsObject:self]) { // being popped to self here } else { // being pushed here } 

一个简单的解决scheme是在viewWillDisappear上添加一个标志,如果VC1已经消失,则将其设置为YES。 否则视图从来没有消失,所以它是第一次推动( Navigation Controller RootViewController )。

示例代码

 BOOL hasDisappeared; -(void)viewWillAppear:(BOOL)animated { if (hasDisappeared==YES) { //VC2 has been popped } else { //VC1 is the rootViewController } } -(void)viewWillDisappear:(BOOL)animated { //Pushing to VC2 hasDisappeared=YES; }