2013-08-12 5 views
2

Фон: На iPad у меня есть кнопка, которая при нажатии, показывает UIActionSheet. В этом листе действий есть 2 варианта, камера и галерея. Камера, когда постучал, вытащил камеру, и все работает нормально. Галерея при нажатии, предположим, чтобы показать popover с фотографиями пользователя в нем.Отображение ImagePickerController из ActionSheet на iPad

Задача: На iPad, UIActionSheet действует как popover. Который при представлении другой popover не может прийти в поле зрения. Ошибка: Terminating app due to uncaught exception 'NSGenericException', reason: '-[UIPopoverController dealloc] reached while popover is still visible.

Мой код:
Установка Действие Лист

- (void)imageButtonTapped:(UIButton *)sender 
{ 
    if (_commentObject.image){ 
     _actionSheet = [[UIActionSheet alloc] initWithTitle:@"Action" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Remove" otherButtonTitles:nil]; 
     _actionSheet.tag = ACTION_IMAGE_REVIEW_TAG; 
    }else{ 
     _actionSheet = [[UIActionSheet alloc] initWithTitle:@"Image Source" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Camera", @"Gallery", nil]; 
     _actionSheet.tag = ACTION_IMAGE_SOURCE_TAG; 
    } 

    if (_isPad) { 
     [_actionSheet showFromRect:_imageButton.frame inView:_scrollViewContent animated:YES]; 
    }else{ 
     [_actionSheet showInView:self.view]; 
    } 
} 

Делегат

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    switch (actionSheet.tag) { 
     case ACTION_IMAGE_SOURCE_TAG: 
      switch (buttonIndex) { 
       case 0: 
        [self pickImage:YES]; 
        break; 
       case 1: 
        [self pickImage:NO]; 
        break; 
       default: 
        break; 
      } 
       break; 
} 

Выполнение

- (void)pickImage:(BOOL)fromCamera 
{ 
    if (fromCamera) { 
     if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){ 
      UIImagePickerController* cameraPickerController = [[UIImagePickerController alloc] init]; 
      cameraPickerController.sourceType = UIImagePickerControllerSourceTypeCamera; 
      cameraPickerController.delegate = self; 
      [self presentViewController:cameraPickerController animated:YES completion:nil]; 
     }else{ 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Camera Unavailable" message:@"Your Device does not support Cameras" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; 
      [alert show]; 
     } 
    }else{ 
     UIImagePickerController *galleryPickerController = [[UIImagePickerController alloc] init]; 
     galleryPickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
     galleryPickerController.delegate = self; 

     if (_isPad) { 
      if ([_actionSheet isVisible]) { 
       [_actionSheet removeFromSuperview]; 
       UIPopoverController *imagePickerPopover = [[UIPopoverController alloc] initWithContentViewController:galleryPickerController]; 
       [imagePickerPopover presentPopoverFromRect:_imageButton.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
      } 
     }else{ 
      [self presentViewController:galleryPickerController animated:YES completion:nil]; 
     } 
    } 
} 

Вопрос: Я попытался удалить лист действия из представления и попытался отклонить его перед выполнением pickImage. Ничего из этого не работает. Как представить галерею?

+1

Это происходит потому, что у вас нет ссылки на ваш 'UIPopoverController'. Имейте сильную ссылку для вашего imagePickerPopover, а затем попробуйте. Никаких проблем не возникнет. –

+0

О, верно, я неправильно определил это. Спасибо. пожалуйста, отправьте его как ответ, чтобы я мог его принять. – Byte

+0

Спасибо !. Его разработали для моего. – Raja

ответ

0

FYI, Это был комментарий и OP попросил поставить его в качестве ответа. Потому что это решило проблему.

Это происходит потому, что у вас нет ссылки на ваш UIPopoverController. У вас есть сильная ссылка для вашего imagePickerPopover, а затем попробуйте. Никаких проблем не возникнет.

+0

Чтобы подробнее ответить на этот вопрос, в скобке и отобразилось мгновение «UIPopoverController * imagePickerPopover». Когда он оставил скобку, он все еще показывал dealloc. Чтобы решить эту проблему, я заменяю локальную переменную 'imagePickerPopover' переменной экземпляра, которая будет сохраняться на протяжении всего жизненного цикла экземпляра. – Byte

2

Ваша задача: Error:Terminating app due to uncaught exception 'NSGenericException', reason: '-[UIPopoverController dealloc] reached while popover is still visible.

делают объект UIPopoverController в вашем .h файл класса. Убедитесь, что ваш @property для вашего UIPopoverController является сильным, а не слабым.

Проверить это

UIPopoverController: dealloc reached while popover is still visible

UIPopovercontroller dealloc reached while popover is still visible

+0

+1 за попытку и почти все правильно. Если вы действительно посмотрите на мой код, вы увидите, что popover определяется в пределах области действия и освобождается в пределах области действия до того, как он будет отклонен. Ничего общего с файлом .h. Комментарий по главному вопросу попал в гвоздь в голове, поэтому я попрошу его опубликовать в качестве ответа. – Byte

0

вы можете попробовать это:

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
     if ([actionSheet isVisible]) { 
      [actionSheet dismissWithClickedButtonIndex:0 animated:NO]; 
     } 
    } 
} 
- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex 
{ 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
     UIImagePickerController *galleryPickerController = ...... 
    } 
} 
Смежные вопросы