Исключение в 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'
11
nl ja de
Что-то не так, потому что я вижу заголовок вопроса как «UIStatusBarStyleBlackTranslucent недоступен на этом устройстве для iPad»
добавлено автор Tricertops, источник

3 ответы

Что касается исключения, сообщение об ошибке очень ясно. «На 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];
}

Edit: As mentioned by @rmaddy, camera can be presented modally. The above is applicable when sourceType is UIImagePickerControllerSourceTypePhotoLibrary.

14
добавлено
@ACB Требование использовать popover применимо только для выбора изображений из библиотеки фотографий. Камера может быть представлена ​​модально в полноэкранном режиме.
добавлено автор rmaddy, источник
Просто попробуйте это самостоятельно UIPopoverController * popover = [[UIPopoverController alloc] initWithContentViewController: picker]; [popover presentPopoverFromRect: self.view.bounds inView: self.view allowedArrowDirections: UIPopoverArrowDirectionAny animated: YES]; . И не используйте эту строку вообще [self presentModalViewController: picker animated: YES];
добавлено автор iDev, источник
@rmaddy, Спасибо за исправление. :) Добавлен ответ.
добавлено автор iDev, источник
@Arun, Как сказал iMartin, вам нужно сохранить popover, я изменил свой ответ, чтобы показать это. Объявите @property для popover и используйте его, как показано в ответе. Если вы новичок, я бы порекомендовал вам пройти учебные пособия Raywenderlich для iPhone
добавлено автор iDev, источник
@Arun, Итак, когда вы работаете в iPad и используете эту функцию, вы получаете какие-либо ошибки? Если нет, можете ли вы открыть фотоальбом/камеру?
добавлено автор iDev, источник
@Arun, проверьте, присутствует ли picker.delegate = self; и убедитесь, что вы внедрили соответствующие методы делегата в себя.
добавлено автор iDev, источник
Также проверьте, добавили ли вы UIImagePickerControllerDelegate , как это, в вашем диспетчере просмотра, @interface viewController: UIViewController . Ниже приведено руководство по iOS 4 по этому вопросу
добавлено автор iDev, источник
@Arun Вам нужно сохранить свойство popover в свойстве. Таким образом, он не будет освобожден. После того, как popover уволит, установите его на ноль (в обратном вызове).
добавлено автор Tricertops, источник
Да, я пробовал это, но он показывает это исключение. Причина NSInvalidArgumentException: «Applicatin попытался представить модально активный контроллер» Большое спасибо за вашу помощь.
добавлено автор Arun, источник
он показывает «Причина NSGenericException»: '- [UIPopoverController dealloc] достигнут, пока popover все еще отображается. я новичок в ios-разработчике, поэтому мне нужна помощь в улучшении моего мастерства, где я должен начать учиться, я просто прочитал книгу «Начало разработки iPad-приложений», куда идти отсюда
добавлено автор Arun, источник
он не показывает никаких исключений или ошибок, но как я могу проверить, работает он или нет
добавлено автор Arun, источник
я не получаю никакой ошибки в iPad-симуляторе, но мой код не вызывает две другие функции делегата, которые являются «imagePickerController» и «imagePickerControllerDidCancel», поэтому их спрашивают так
добавлено автор Arun, источник
Все вы спасибо за вашу помощь ..
добавлено автор Arun, источник

@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;
5
добавлено

Для Swift с iOS11:

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

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

           //then config popover frame and arrow style here
0
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.