Search code examples
iosuinavigationcontrollerpushviewcontrollerpopviewcontroller

iOS: isMovingToParentViewController is not working as expected


My setup is simple, and my issue is not very different from this one. However to better explain it I have posted it here:

NavController -> VC1 -> VC2

VC1 is root view controller of NavController. VC2 is accessible via Push segue from VC1.

I want to detect, within VC1, whether:

It appeared directly as root view controller (via Push) It appeared as a result of VC2 being popped

I read the docs which says following should tell me if later is true.

isMovingToParentViewController == NO 

However that is not the case, and above condition ALWAYS turns out to be TRUE. Which means that, (self.isMovingToParentViewController == NO) is always happening.

Here is my code:

- (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
    }    
}

Same is the case for viewDidAppear, too.

For a matter of fact check, I put breakpoint at the start, and checked that all of the following are FALSE, in both cases:

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

What is happening? Is there anything I goofed up in my storyboard? Please help...


Solution

  • Unfortunately, isMovingToParentViewController isn't true for the root view controller, so I usually handle this situation with a 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");
        }
    }