使用UIPopoverController时,当调用"UIPopoverPresentationController presentationTransitionWillBegin"时崩溃

4

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

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

我看了这里一个类似的崩溃 - iOS8 iPad上UIActivityViewController崩溃,但我在我的代码中没有直接使用“UIPopoverPresentationController”。

我的主控制器是UIViewController,并且有一个barbuttonitem,当点击它时,会打开一个弹出窗口作为另一个控制器,即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"方法中的"sender"始终存在,即在旋转之前和之后都存在,并且是同一个对象。
有什么想法为什么popoverPresentationController为空或应用程序为什么会崩溃吗?
1个回答

4

这是一个关于iOS8的问题。正如您所知,-didRotateFromInterfaceOrientation:在iOS8中已被弃用。尝试使用新的API -viewWillTransitionToSize:withTransitionCoordinator:。只需实现它即可解决您的问题。

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

太好了。这实际上有助于解决问题。但是你知道为什么它会抱怨sourceView和barButtonItem吗?根据我所学的,似乎没有设置sourceType或barButtonItem,因此它会崩溃。 - tech_human

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接