iPad中的异常,UIImagePickerController必须通过UIPopoverController呈现

11

我已经创建了一个从摄像头捕捉图像的应用程序,这是我的代码

 -(IBAction) showCameraUI {
    BOOL hasCamera = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
    UIImagePickerController* picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.sourceType = hasCamera ? UIImagePickerControllerSourceTypeCamera :    UIImagePickerControllerSourceTypePhotoLibrary;
    [self presentModalViewController:picker animated:YES];
}

我实现了这个代理方法来获取捕获的图像

- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    [picker dismissModalViewControllerAnimated:YES];
    UIImage* image = [info objectForKey:UIImagePickerControllerOriginalImage];
    UIImage *yourImageView = image;
}

如果用户取消控制器,请执行此方法

- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker
{
    [picker dismissModalViewControllerAnimated:YES];
}

但它显示了这个异常。有人知道为什么在执行函数showCameraUI的最后一行后会出现这样的异常吗?

UIStatusBarStyleBlackTranslucent is not available on this device. 2013-02-07 
10:06:06.976 CaptureImage[460:c07] *** Terminating app due to uncaught exception
'NSInvalidArgumentException', reason: 'On iPad, UIImagePickerController must be 
presented via UIPopoverController'

1
有些问题,因为我看到问题标题是“UIStatusBarStyleBlackTranslucent在iPad上不可用”。 - Tricertops
3个回答

14

关于异常,错误信息非常清晰。 “在iPad上,必须通过UIPopoverController显示UIImagePickerController” 对于iPad,您应该在UIPopoverController中呈现它,而不是使用[self presentModalViewController:picker animated:YES];。 这应该解决问题。

例如:

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
    UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:picker];
    [popover presentPopoverFromRect:self.view.bounds inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    self.popover = popover;
} else {
    [self presentModalViewController:picker animated:YES];
}

编辑:正如 @rmaddy 所提到的,相机可以以模态形式呈现。上述内容适用于 sourceTypeUIImagePickerControllerSourceTypePhotoLibrary 的情况。


1
是的,我尝试过这个,但它显示了这个异常NSInvalidArgumentException原因:'应用程序试图以模态方式呈现一个活动控制器'非常感谢您的帮助。 - Arun
1
只需尝试使用以下代码 UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:picker]; [popover presentPopoverFromRect:self.view.bounds inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];。请勿使用此行代码 [self presentModalViewController:picker animated:YES]; - iDev
1
它显示了“NSGenericException”原因:“在弹出窗口仍可见的情况下到达-[UIPopoverController dealloc]。我是iOS开发新手,所以我想要一些帮助来提高我的技能。我应该从哪里开始学习?我刚读完一本书《Beginning iPad Application Development》,接下来该去哪里? - Arun
2
@Arun,正如iMartin所说,您需要保留弹出窗口,我已经修改了我的答案来展示它。为弹出窗口声明一个@property并像答案中所示使用它。如果您是初学者,我建议您阅读Raywenderlich iPhone教程 - iDev
1
还要检查一下你的视图控制器中是否添加了 UIImagePickerControllerDelegate,像这样:@interface viewController : UIViewController <UIImagePickerControllerDelegate, UIPopoverControllerDelegate>。这里有一个关于 iOS 4 的教程 - iDev
显示剩余6条评论

5

@Arun 我也遇到了在头文件中添加全局属性的问题。

希望下面的代码对你有用:

UIImagePickerController *imgPicker = [[UIImagePickerController alloc] init];
   [imgPicker setDelegate:self];
   [imgPicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
   [imgPicker setAllowsEditing:YES];
   [imgPicker setModalPresentationStyle:UIModalPresentationCurrentContext];

   UIPopoverController *popOver = [[UIPopoverController alloc] initWithContentViewController:imgPicker];
   popOver.delegate = self;
   self.popoverImageViewController = popOver;
   [self.popoverImageViewController presentPopoverFromRect:CGRectMake(0, 0, 160, 40) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

在该头文件中创建全局属性,如下所示:
@property (strong) UIPopoverController *popoverImageViewController;

0

对于在iOS11中使用Swift:

            videoEditor.modalPresentationStyle = .popover
            self.present(picker, animated: true)

            let popover = picker.popoverPresentationController
            popover?.sourceView = self.view

            // then config popover frame and arrow style here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接