jjzjj

ios - "UIPopoverPresentationController presentationTransitionWillBegin"使用 UIPopoverController 时崩溃

coder 2023-09-28 原文

当我通过点击主 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/

有关ios - "UIPopoverPresentationController presentationTransitionWillBegin"使用 UIPopoverController 时崩溃的更多相关文章

随机推荐