使用UIPopoverController时“UIPopoverPresentationController presentationTransitionWillBegin”崩溃

时间:2014-12-26 20:06:49

标签: ios objective-c ios8 uipopovercontroller

当我通过点击主控制器上的条形按钮项目然后旋转视图来打开弹出窗口时,我发生了以下崩溃。

"NSGenericException: UIPopoverPresentationController should have a non-nil sourceView or barButtonItem set before the presentation occurs."

我在这里看到了类似的崩溃 - UIActivityViewController crashing on iOS8 iPads,但我没有直接使用" UIPopoverPresentationController"在我的代码中的任何地方。

我的主控制器是一个UIViewController并且有一个barbuttonitem,当点击时打开一个popover作为另一个控制器,它是UITableViewController(DisplayTableViewController类)。以下是代码:

在我的主控制器中使用自定义方法说" 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];
}

当我旋转视图时,会执行此操作。此代码也在我的主控制器中:

- (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为零或为什么应用程序崩溃?

1 个答案:

答案 0 :(得分:4)

这是iOS8问题。如您所知,iOS8中已弃用-didRotateFromInterfaceOrientation:。尝试新的API -viewWillTransitionToSize:withTransitionCoordinator:。实施它可以解决您的问题。

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator 
{
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
    // we have nothing to do.
}