我在解除MPMoviePlayerViewController
后立即展示全屏视图控制器(特别是UIPopoverController
)时遇到了一些困难。基本上,我有一个竞争条件,我不确定是否有一个公认的最佳做法来纠正它。这是我开始使用的代码:
[[self searchPopoverController] dismissPopoverAnimated:YES];
MPMoviePlayerViewController *player = [[MPMoviePlayerViewController *player = [[MPMoviePlayerViewController alloc] initWithContentURL:[video videoURL]];
[[player moviePlayer] setFullscreen:YES animated:YES];
[self presentMoviePlayerViewControllerAnimated:player];
问题是在下一行代码执行之前,popover实际上并没有被忽略,导致(正如预期的那样)“在演示文稿正在进行时尝试呈现[视图控制器]”警告。有点幽默,视频确实开始播放(你可以听到音频),但没有呈现视图控制器,所以你看不到视频。
我试过用几种方法解决这个问题。我发现唯一可靠的解决方案是丑陋而且不能保证解决方案:
[[self searchPopoverController] dismissPopoverAnimated:YES];
dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC));
dispatch_after(start, dispatch_get_main_queue(), ^(void){
MPMoviePlayerViewController *player = [[MPMoviePlayerViewController *player = [[MPMoviePlayerViewController alloc] initWithContentURL:[video videoURL]];
[[player moviePlayer] setFullscreen:YES animated:YES];
[self presentMoviePlayerViewControllerAnimated:player];
});
由于UIPopoverController
不从UIViewController
继承,我不相信有任何方法可以解除包含完成处理块的弹出窗口。我尝试过使用NSInvocationOperation
和NSOperationQueue
,但没有成功,例如:
NSInvocationOperation *invokedOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(playVideo:) object:video];
[[NSOperationQueue mainQueue] addOperation:invokedOperation];
有很多关于这个问题的现有问题,但大多数似乎围绕着解雇UIViewController
或子类,dismissViewControllerAnimated:completion:
是一个明显的解决方案。
答案 0 :(得分:1)
您应该使用popover委托方法popoverControllerDidDismissPopover
答案 1 :(得分:0)
为什么不实现UIPopoverControllerDelegate协议并将控制器添加为委托,然后可以从
关闭第二个viewController-(void)popoverControllerDidDismissPopover: