[英]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:
它应该像这样工作:
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.