【问题标题】:Presenting a View Controller after a UIPopoverController is dismissed在 UIPopoverController 被解除后呈现视图控制器
【发布时间】:2015-04-10 12:54:14
【问题描述】:

我在关闭 UIPopoverController 后立即呈现全屏视图控制器(特别是 MPMoviePlayerViewController)时遇到了一些困难。本质上,我有一个竞争条件,我不确定是否有公认的最佳实践来纠正它。这是我开始使用的代码:

   [[self searchPopoverController] dismissPopoverAnimated:YES];

   MPMoviePlayerViewController *player = [[MPMoviePlayerViewController *player = [[MPMoviePlayerViewController alloc] initWithContentURL:[video videoURL]];
   [[player moviePlayer] setFullscreen:YES animated:YES];
   [self presentMoviePlayerViewControllerAnimated:player];

问题在于,在执行下一行代码之前,弹出框实际上并没有关闭,导致(如预期的那样)“在演示过程中尝试呈现 [视图控制器]”警告。有点幽默的是,视频确实开始播放(你可以听到音频),但视图控制器没有出现,所以你看不到视频。

我已尝试通过多种方式解决此问题。我发现的唯一可靠的解决方案是丑陋的,并且不能保证修复:

   [[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: 是一个明显的解决方案。

【问题讨论】:

  • 你可以使用 [[self searchPopoverController]dismissPopoverAnimated:NO] 并使用 onComplete 处理程序将其包装在基于块的 UIViewAnimation 中吗?
  • 你的意思是通过animateWithDuration:animations:completion:?如果是这样,我只是尝试过,但它产生了同样的错误。在弹出框完全解除之前,完成块仍然会触发。我的猜测是该方法认为动画块是完整的,因为它并非旨在处理诸如弹出框解雇之类的事情。但如果你的意思是别的,请为我澄清。
  • 我的意思是在animateWithDuration:animations:completion: 中手动淡出它,然后在完成调用[[self searchPopoverController] dismissPopoverAnimated:NO] 和您的其余代码时。
  • 我不认为动画本身就是问题所在。例如,即使我将其更改为[[self searchPopoverController] dismissPopoverAnimated:NO];,问题仍然存在。在我看来,我自己为弹出框控制器的解除设置动画将是一项过多的工作,因为它不是从UIView 继承的。但我会探索这个选项。

标签: ios objective-c ipad ios8 uipopovercontroller


【解决方案1】:

【讨论】:

  • 不幸的是,这不起作用。该委托方法不会被调用以响应 UIPopoverController 的编程解除 - 仅用于通过在弹出框控制器外部点击触发的自动解除。
【解决方案2】:

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

触发第二个 viewController
-(void)popoverControllerDidDismissPopover:

【讨论】:

  • 因此,来自UIPopoverControllerDelegate 上的文档:“弹出框控制器不会调用此方法以响应对dismissPopoverAnimated: 方法的编程调用。如果您以编程方式关闭弹出框,您应该执行在调用 dismissPopoverAnimated: 方法后立即执行任何清理操作。"
  • 我认为可以提出一个论点,即任何解除弹出框确实应该调用该委托方法,但我相信苹果有他们的理由。但是,鉴于此,我不确定为什么程序化解除方法 dismissPopoverAnimated: 没有完成块选项。
猜你喜欢
  • 1970-01-01
  • 2017-04-07
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多