简体   繁体   English

如何修复 AVPlayer 的视图控制器层次结构?

[英]How to fix view controller hierarchy for AVPlayer?

I have an iOS app with a single player and login.我有一个带有单个播放器和登录名的 iOS 应用程序。 It should work like this:它应该像这样工作:

  • 1) Run app 1) 运行应用
  • 2) login 2)登录
  • 3) after login video directly starts playing 3)登录后视频直接开始播放
  • 4) if you exit the video it should ask for whether you want to logout 4)如果您退出视频,它应该询问您是否要注销
  • 5) if no should continue to playing the stream 5)如果没有应该继续播放流
  • 6) if yes logout the app 6)如果是,请注销该应用程序
  • 7) and if user logs in again without killing app it should repeat the steps from 2-7 7)如果用户没有杀死应用程序再次登录,则应重复2-7的步骤

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:视频保持全屏,并给出以下警告:

Warning: <AVPlayerViewController: 0x7f9fca08aa00> is trying to exit full screen, but is not in its view's window's view controller hierarchy. This results in undefined behavior. 

I am really new to xcode ios and objectiveC and my code is as follows我对 xcode ios 和objectiveC 真的很陌生,我的代码如下

- (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 ");

} }

I really don't understand why it does not work after the logout and need help.我真的不明白为什么它在注销后不起作用并需要帮助。

You just need to relate your avplayer controller to window view.您只需要将您的 avplayer 控制器与窗口视图相关联。 Instead just presenting the avcontroller add below line-相反,只是在下面添加 avcontroller 行 -

Objective C-目标 C-

[self.view.window.rootViewController presentViewController:controller animated:YES completion:nil]; [self.view.window.rootViewController presentViewController:controller animation:YES 完成:nil];

Swift 5 -斯威夫特 5 -

view.window.rootViewController?.present(controller, animated: true) view.window.rootViewController?.present(控制器,动画:真)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM