Исключение в iPad, UIImagePickerController должно быть представлено через UIPopoverController

Я создал приложение для захвата изображения с камеры. Это мой код

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

Что касается исключения, сообщение об ошибке очень ясно. "На iPad UIImagePickerController должен быть представлен через UIPopoverController" Для 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, камера может быть представлена ​​модально. Вышеприведенное применимо, если sourceType равно UIImagePickerControllerSourceTypePhotoLibrary.

Ответ 2

@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;