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

我需要帮助找出这个崩溃。 我检查了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]; } } 

如果我点击button索引1并closuresUIPopoverController然后单击button索引0拍照我的应用程序崩溃。

这是我的崩溃报告

'终止应用程序,由于未捕获的exception'NSGenericException',原因:'UIPopoverPresentationController()应该有一个非零的sourceView或barButtonItem在演示之前设置。

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

你需要有一个强大的参考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; } 

注意文档中的讨论:

sourceRect

将此属性与sourceView属性结合使用可指定popup窗口的锚点位置。 或者,您可以使用barButtonItem属性指定popup窗口的锚点位置。

很清楚,简洁。 只需添加一个sourceView引用

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