iOS的崩溃:终止应用程序由于未捕获的异常原因:UIPopoverPresentationContr

2019-10-22 06:00发布

我需要帮助搞清楚这个崩溃了。 我检查了计算器的答案,但答案不涉及到我的情况。 这是我的代码。

  - (void)addImagesActionSheetClickedButtonAtIndex:(NSInteger)buttonIndex
{
    // Cancel
    if (buttonIndex == 2) return;

    //Take picture
    if (buttonIndex == 0)
    {
        //Take picture
        isFromLibrary = NO;
        [self.imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
        [self.navigationController presentViewController:self.imagePicker animated:YES completion:NULL];
        return;
    }

    // Library picture
    if (buttonIndex == 1)
    {

    if (![UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeSavedPhotosAlbum]) return;

    UIPopoverController *popup = [[UIPopoverController alloc] initWithContentViewController:self.imagePicker];
    [popup presentPopoverFromRect:CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height/4, 0, 0)inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    }
}

如果我点击按钮指数1和罢免UIPopoverController然后单击按钮指数0到拍照我的应用程序崩溃。

这里是我的崩溃报告

“终止应用程序由于未捕获的异常‘NSGenericException’,原因:” UIPopoverPresentationController()应该有一个非空sourceView或barButtonItem呈现发生之前设置。

任何建议或提示赞赏。 如果我需要发布更多的代码,请让我知道。

Answer 1:

你需要有很强的参考,以popup

@property (nonatomic, strong) UIPopoverController *popup;

然后使用

 - (void)addImagesActionSheetClickedButtonAtIndex:(NSInteger)buttonIndex
{
    // Cancel
    if (buttonIndex == 2) return;

    //Take picture
    if (buttonIndex == 0)
    {
        //Take picture
        isFromLibrary = NO;
        [self.imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
        [self.navigationController presentViewController:self.imagePicker animated:YES completion:NULL];
        return;
    }

    // Library picture
    if (buttonIndex == 1)
    {

    if (![UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeSavedPhotosAlbum]) return;

        self.popup = [[UIPopoverController alloc] initWithContentViewController:self.imagePicker];
        [self.popup presentPopoverFromRect:CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height/4, 0, 0)inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    }
}

并实施UIPopoverControllerDelegate

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController{

    self.popup = nil;

}


Answer 2:

注意文档中的讨论:

sourceRect

使用结合此属性与sourceView属性来指定酥料饼的锚位置。 另外,您也可以指定使用barButtonItem属性酥料饼的锚位置。

很清楚,简明。 只需添加一个sourceView参考

https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIPopoverPresentationController_class/index.html#//apple_ref/occ/instp/UIPopoverPresentationController/sourceRect



文章来源: iOS Crash: Terminating app due to uncaught exception reason: UIPopoverPresentationController should have a non-nil sourceView