title: How to fix view controller hierarchy for AVPlayer?
body: <p>I have an iOS app with a single player and login. It should work like this:</p>
  
  <ul>
  <li>1) Run app</li>
  <li>2) login  </li>
  <li>3) after login video directly starts playing</li>
  <li>4) if you exit the video it should ask for whether you want to logout</li>
  <li>5) if no should continue to playing the stream</li>
  <li>6) if yes logout the app</li>
  <li>7) and if user logs in again without killing app it should repeat the steps from 2-7</li>
  </ul>
  
  <p>However, my code does everything except the last step. If user logs out and logs in
    - it starts playing the stream
    but when you click the done button and try to exit from video, it does not work. Video stays full screen and it gives the following warning: </p>
  
  <pre><code>Warning: &lt;AVPlayerViewController: 0x7f9fca08aa00&gt; is trying to exit full screen, but is not in its view's window's view controller hierarchy. This results in undefined behavior. 
  </code></pre>
  
  <p>I am really new to xcode ios and objectiveC and my code is as follows</p>
  
  <pre><code>- (void)viewDidLoad {
  
      NSLog(@"ChannelListingViewController::viewDidLoad(): Called...");
      [super viewDidLoad];
  
      self.check=1;
  
      NSLog(@"ChannelListingViewController::viewDidLoad(): Exiting...");
  }
  
  -(void) playVideo
  {
      self.channelURL = [TulixAppGlobalConfig getUserSubscribedPlanChannels];
  
  
      NSURL *url = [[NSURL alloc] initWithString:[self.channelURL[1] getChannelHlsStreamURL]];
      self.player = [AVPlayer playerWithURL:url];
  
      // create a player view controller
      [self presentViewController:controller animated:YES completion:nil];
      self.controller.player = self.player;
      [self.player play];
  
  }
  -(void) viewDidAppear:(BOOL)animated
  {
  
      self.controller = [[AVPlayerViewController alloc] init];
  
      NSLog(@"ChannelListingViewController::viewDidAppear(): Called...");
      if(self.check==0)
      {
          NSLog(@" 0 checkvalue: %i",check);
          [self showLogoutConfirmationDialog];
      }
      else{
          self.check =0;
          NSLog(@" 1 checkvalue: %i",check);
          [self playVideo];
  
      }
  
      [self spawnKeepAliveThread];
      NSLog(@"ChannelListingViewController::viewDidAppear(): Exiting...");
  }
  
  -(void) showLogoutConfirmationDialog
  {
      void (^ptrFuncCompletionBlock)(void) = ^(void) {     NSLog(@"ChannelListingViewController::showLogoutConfirmationDialog():GENERIC CALL BACK...");
      [self attemptToLogoutUser];
  };
  NSLog(@"ChannelListingViewController::showLogoutConfirmationDialog(): Called...");
  
  UIAlertAction* alertActionYes = [UIAlertAction actionWithTitle:@"Yes" style:UIAlertActionStyleDefault
                                                           handler:^(UIAlertAction * action) {
                                                               //Do Some action here
                                                               NSLog(@"ChannelListingViewController::showLogoutConfirmationDialog:: Called for YES...");
                                                               self.check = 1;
                                                               NSLog(@" yes checkvalue: %i",check);
                                                               [self.activeAlterController dismissViewControllerAnimated:NO completion:ptrFuncCompletionBlock];
                                                               [self attemptToLogoutUser];
                                                           }];
  UIAlertAction* alertActionNo = [UIAlertAction actionWithTitle:@"No" style:UIAlertActionStyleCancel
                                                            handler:^(UIAlertAction * action) {
                                                                NSLog(@"ChannelListingViewController::showLogoutConfirmationDialog:: Called for NO...");
                                                                [self playVideo];
  
                                                            }];
  
  NSMutableArray* arrayAlertActions = [NSMutableArray arrayWithObjects:alertActionYes, alertActionNo, nil];
  self.activeAlterController = [HelperUtility showMultiButtonDialogHavingTitle:@"Logout" withMessage:@"Are you sure you want to log out?" andAlertActions:arrayAlertActions];
  
  [self presentViewController:self.activeAlterController animated:YES completion:nil];
  
  NSLog(@"ChannelListingViewController::showLogoutConfirmationDialog(): Exit ");
  </code></pre>
  
  <p>}</p>
  
  <p>I really don't understand why it does not work after the logout and need help. </p>