【发布时间】: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,我不相信有任何方法可以消除包含完成处理块的弹出框。我试过使用NSInvocationOperation和NSOperationQueue,没有成功,例如:
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