在UIPopoverController被解除后呈现视图控制器

时间:2015-02-10 13:11:18

标签: ios objective-c ipad ios8 uipopovercontroller

我在解除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继承,我不相信有任何方法可以解除包含完成处理块的弹出窗口。我尝试过使用NSInvocationOperationNSOperationQueue,但没有成功,例如:

   NSInvocationOperation *invokedOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(playVideo:) object:video];
   [[NSOperationQueue mainQueue] addOperation:invokedOperation];

有很多关于这个问题的现有问题,但大多数似乎围绕着解雇UIViewController或子类,dismissViewControllerAnimated:completion:是一个明显的解决方案。

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

为什么不实现UIPopoverControllerDelegate协议并将控制器添加为委托,然后可以从

关闭第二个viewController
-(void)popoverControllerDidDismissPopover: