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

Posted

技术标签:

【中文标题】iOS 崩溃:由于未捕获的异常原因而终止应用程序:UIPopoverPresentationController 应该有一个非零的 sourceView【英文标题】:iOS Crash: Terminating app due to uncaught exception reason: UIPopoverPresentationController should have a non-nil sourceView 【发布时间】:2015-03-11 02:02:05 【问题描述】:

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

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

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

【问题讨论】:

见这里:***.com/questions/42920340/… 【参考方案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

【讨论】:

【参考方案2】:

你需要对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;


【讨论】:

以上是关于iOS 崩溃:由于未捕获的异常原因而终止应用程序:UIPopoverPresentationController 应该有一个非零的 sourceView的主要内容,如果未能解决你的问题,请参考以下文章

应用程序崩溃:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 0 节中的行数无效

“由于未捕获的异常而终止应用程序”在推送视图控制器时崩溃

由于未捕获的异常“NSRangeException”而导致应用程序终止

目标 C:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序

由于未捕获的异常 NSInvalidArgumentException 而终止应用程序,原因:索引无效

iOS5 和 XCode4 错误 - 由于未捕获的异常“NSUnknownKeyException”而终止应用程序