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”而终止应用程序