当我通过点击主 Controller 上的条形按钮项目然后旋转 View 打开弹出窗口时,我遇到了以下崩溃。
"NSGenericException: UIPopoverPresentationController should have a non-nil sourceView or barButtonItem set before the presentation occurs."
我在这里看到了类似的崩溃 - UIActivityViewController crashing on iOS8 iPads ,但我没有在代码中的任何地方直接使用“UIPopoverPresentationController”。
我的主 Controller 是一个 UIViewController 并且有一个 barbuttonitem,当点击它时打开一个弹出窗口作为另一个 Controller ,它是 UITableViewController(DisplayTableViewController 类)。下面是代码:
在我的主 Controller 中,在自定义方法中说“createPopover”我有:
- (void)createPopover
{
self.tableViewController = [[DisplayTableViewController alloc] init];
self.tableViewController.someDelegate = self;
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:self.tableViewController];
// Display the popover.
self.navBarButtonItemPopoverController = [[UIPopoverController alloc] initWithContentViewController:navigationController];
self.navBarButtonItemPopoverController.delegate = self;
[self displayPopover:self.myBarButton];
}
- (void)displayPopover:(id)sender
{
[self.navBarButtonItemPopoverController presentPopoverFromBarButtonItem:sender
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
}
当我旋转 View 时,它会被执行。这段代码也在我的主 Controller 中:
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
[super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
if ([self.navBarButtonItemPopoverController isPopoverVisible])
{
[self.navBarButtonItemPopoverController dismissPopoverAnimated:NO];
[self performSelector:@selector(displayPopover:) withObject:self.myBarButton afterDelay:0.0];
}
}
在此之后,应用程序因上述错误而崩溃。在我的 createPopover 方法中,我尝试了:
self.tableViewController.popoverPresentationController.sourceView = [self view];
但没有任何帮助。当我在生命周期中的任何时候打印出“self.tableViewController.popoverPresentationController”或“self.popoverPresentationController”时,它始终为零。我还注意到 displayPopover 方法中的“发送者”始终存在,即在旋转之前和旋转之后也是同一个对象。
知道为什么 popoverPresentationController 为 nil 或应用崩溃的原因吗?
最佳答案
这是 iOS8 的问题。如您所知,-didRotateFromInterfaceOrientation: 在 iOS8 中已被弃用。尝试新的 API -viewWillTransitionToSize:withTransitionCoordinator:。只需实现它就可以解决您的问题。
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
// we have nothing to do.
}
关于ios - "UIPopoverPresentationController presentationTransitionWillBegin"使用 UIPopoverController 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27661455/