iOS崩溃:由于未捕获的异常原因终止应用程序:UIPopoverPresentationController应该有一个非零的sourceView

时间:2015-03-11 02:02:06

标签: ios objective-c crash uipopovercontroller

我需要帮助解决这个崩溃问题。我检查了stackoverflow的答案,但没有答案与我的情况有关。这是我的代码。

  - (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。

任何建议或提示表示赞赏。如果我需要发布更多代码,请告诉我。

2 个答案:

答案 0 :(得分:1)

请注意文档中的讨论:

sourceRect

  

将此属性与sourceView属性一起使用以指定弹出窗口的锚点位置。或者,您可以使用barButtonItem属性指定弹出窗口的锚点位置。

非常清晰简洁。只需添加一个sourceView参考

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

答案 1 :(得分:0)

您需要强烈引用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

in

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

    self.popup = nil;

}