【问题标题】:"UIPopoverPresentationController presentationTransitionWillBegin" crash when using UIPopoverController使用 UIPopoverController 时“UIPopoverPresentationControllerpresentationTransitionWillBegin”崩溃
【发布时间】:2014-12-26 20:06:48
【问题描述】:

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

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

我在这里看到了类似的崩溃 - UIActivityViewController crashing on iOS8 iPads,但我没有在代码中的任何地方直接使用“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 方法中的“发送者”始终存在,即在旋转之前和之后也是相同的对象。

知道为什么 popoverPresentationController 为 nil 或应用程序崩溃的原因吗?

【问题讨论】:

    标签: ios objective-c ios8 uipopovercontroller


    【解决方案1】:

    这是 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 没有设置,因此它崩溃了。
    猜你喜欢
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    相关资源
    最近更新 更多