2013-10-24 3 views
5

У меня возникла проблема с представлением UIImagePickerController на устройствах iOS 7. Я использую следующий код, чтобы представить сборщик изображений.Представление UIImagePickerController вызывает сбой на iOS 7

UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init]; 
cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera; 
cameraUI.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera]; 
cameraUI.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto; 
cameraUI.delegate = self; 

[[self presentViewController:cameraUI animated:YES completion:NULL]; 

После вызова presentViewController приложение вылетает из-за неправильного доступа exec. Консоль сообщает о следующих исключениях.

[SBSAccelerometer valueRestriction]: unrecognized selector sent to instance 0x1650e360 
[__NSCFNumber valueRestriction]: unrecognized selector sent to instance 0x146d0e70 

Я позвонил зомби, чтобы узнать, освобождается ли объект преждевременно. Zombies сообщает о следующих исключениях:

[NSISRestrictedToNonNegativeVariable retain]: message sent to deallocated instance 0x156f0010 

Любые мысли?

EDIT

Вот трассировки стека я получаю с зомби с поддержкой:

enter image description here

+0

Вы используете это на самом устройстве? (может быть, он сбой на симуляторе, если я правильно помню.) Кроме того, может быть стоит проверить, что '[UIImagePickerController availableMediaTypesForSourceType:' по какой-то причине не возвращает пустой массив. – Macondo2Seattle

+0

Какую трассировку стека вы видите для отчета зомби? Вы пробовали сделать минимальный тест? Я не думаю, что код, который вы показываете, является (все) проблемой. –

+0

Я запускаю код на iPhone 5S под управлением iOS 7, который приводит к сбою, но он работает на iPhone 4 с iOS 6. Я проверил mediaTypes и public.image и public.movie. – Eytan

ответ

1

Это ошибка в прошивке 7 на IPad. Похоже, сейчас решение состоит в том, чтобы запросить разрешение на фотографии перед открытием UIPopoverControl. Вот как я реализовал свое решение:

**// Photo Library 
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) 
{ 
    void(^blk)() = ^() { 
     UIImagePickerController* picker = [[UIImagePickerController alloc] init]; 
     picker.delegate = self; 
     picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
     if (NIIsPad()) { 
      UIPopoverController* popover = [[UIPopoverController alloc] initWithContentViewController:picker]; 
      [popover presentPopoverFromBarButtonItem:self.popoverAnchor permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
     } else { 
      [self.navigationController presentModalViewController:picker animated:YES]; 
     } 
    }; 

    // Make sure we have permission, otherwise request it first 
    ALAssetsLibrary* assetsLibrary = [[ALAssetsLibrary alloc] init]; 
    ALAuthorizationStatus authStatus; 
    if (IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")) 
     authStatus = [ALAssetsLibrary authorizationStatus]; 
    else 
     authStatus = ALAuthorizationStatusAuthorized; 

    if (authStatus == ALAuthorizationStatusAuthorized) { 
     blk(); 
    } else if (authStatus == ALAuthorizationStatusDenied || authStatus == ALAuthorizationStatusRestricted) { 
     [[UIAlertView alertViewWithTitle:@"Grant photos permission" message:@"Grant permission to your photos. Go to Settings App > Privacy > Photos."] show]; 
    } else if (authStatus == ALAuthorizationStatusNotDetermined) { 
     [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 
      // Catch the final iteration, ignore the rest 
      if (group == nil) 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        blk(); 
       }); 
      *stop = YES; 
     } failureBlock:^(NSError *error) { 
      // failure :(
      dispatch_async(dispatch_get_main_queue(), ^{ 
       [[UIAlertView alertViewWithTitle:@"Grant photos permission" message:@"Grant permission to your photos. Go to Settings App > Privacy > Photos."] show]; 
      }); 
     }]; 
    } 
}** 

Не забудьте добавить AssetsLibrary.framework к вашему проекту.

+1

Я ценю ответ Vizlix; однако я видел этот ответ в другом месте в stackoverflow и проверял мои разрешения, прежде чем я разместил вопрос. Кроме того, авария происходит на iPhone, а не на iPad. – Eytan

+0

Я застрял на этом или возрасты. Я использую iOS SDK 6.1, и мой UIImagePickerController падает на iPhone4S с iOS7. он отлично работает на iPhone4 с iOS7! Кто-нибудь смог это исправить? – ShayanK

Смежные вопросы