56 votes

UIImagePickerController ne présentant pas dans iOS 8

Est-ce que quelqu'un d'autre a un problème avec UIImagePickerController dans iOS 8? La méthode ci-dessous fonctionne parfaitement dans iOS 7 sur iPad, mais le message d'erreur suivant s'affiche lorsque j'exécute cette opération dans XCode 6 (version bêta 3 ou 4) lorsque j'essaie de présenter le sélecteur (dernière ligne). Si cela compte, la sélection du type de source provient d'un alertView présenté au même endroit.

 Warning: Attempt to present <UIImagePickerController: 0x7c0ae400>  on <CAGUCreateContactViewController: 0x7bf61a00> which is already presenting (null)
 

Méthode pour ouvrir imagePicker.

 - (void)openPhotoPicker:(UIImagePickerControllerSourceType)sourceType
{
    if ([UIImagePickerController isSourceTypeAvailable:sourceType]) {
        NSArray *availableMediaTypes = [UIImagePickerController availableMediaTypesForSourceType:sourceType];
        if ([availableMediaTypes containsObject:(NSString *)kUTTypeImage]) {
            UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
            imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen;
            imagePickerController.sourceType = sourceType;
            imagePickerController.mediaTypes = @[(NSString *)kUTTypeImage];
            imagePickerController.delegate = self;

            self.imagePickerController = imagePickerController;

            if (sourceType == UIImagePickerControllerSourceTypeCamera) {
                [self presentViewController:self.imagePickerController animated:YES completion:nil];
            } else {                    
                if (self.popoverVC) {
                    [self.popoverVC dismissPopoverAnimated:YES];
                    self.popoverVC = nil;
                }

                self.popoverVC = [[UIPopoverController alloc] initWithContentViewController:imagePickerController];
                [self.popoverVC presentPopoverFromRect:self.nameAndPicCell.picture.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
            }
        }
    }
}
 

108voto

Ben Lings Points 11395

Je pense que cela est dû au fait que dans iOS 8, les vues d'alerte et les feuilles d'action sont réellement présentées aux contrôleurs de vue ( UIAlertController ). Ainsi, si vous présentez un nouveau contrôleur de vue en réponse à une action du UIAlertView , il est présenté pendant que le UIAlertController est rejeté. J'ai résolu le problème en retardant la présentation du UIImagePickerController jusqu'à la prochaine itération du runloop, en procédant comme suit:

 [[NSOperationQueue mainQueue] addOperationWithBlock:^{
    [self openPhotoPicker:sourceType];
}];
 

80voto

lakiluk Points 676

Je suis d'accord avec la détection de problème Ben Lings. Je suggérerais une solution plus simple au cas où vous utiliseriez UIActionSheet. J'ai simplement déplacé mon code qui réagit à la sélection de la feuille d'action à partir de:

 - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex;
{
// my code
}
 

dans:

 - (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex;  // after animation
{
// my code
}
 

De cette façon, l'application garantit que le code sera exécuté APRÈS la fin de l'animation UIActionSheet.

UIAlertView ayant une méthode déléguée similaire:

 - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex;  // after animation
{
// my code
}
 

Je suppose qu'une solution similaire peut s'appliquer.

12voto

Voici une solution qui a fonctionné pour moi

 if([[[UIDevice currentDevice] systemVersion] floatValue]>=8.0)
{
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{

        [self presentViewController:cameraUI animated:NO completion:nil];
    }];

}
else{

    [controller presentViewController:cameraUI animated:NO completion:nil];
}
 

N'oubliez pas d'allouer cameraUI

 UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init];
cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera;
 

Construire et aller!

8voto

Piyush Mathur Points 118

J'ai été confrontée au même problème dans iOS 8. Puis j'ai vu le journal des modifications de la dernière mise à jour à iOS, c'est à dire 8.0.2 sur l'appareil.

Il est mentionné dans cette mise à jour that_

"Résout un problème empêchant certaines apps d'accéder aux photos à partir de Photos de la Bibliothèque"

Afin de tester votre application à l'aide de XCode 6 sur l'appareil avec iOS 8.0.2 version, il sera beau travail Ne pas le tester sur iOS 8.0 simulateur.

Cela m'a aidé, j'espère que la même chose pour vous.

Screen-shot of iOS 8.0.2 Update change log

4voto

N J Gadhiya Points 2104
UIImagePickerController *imagePickerController= [[UIImagePickerController alloc] init];
[imagePickerController setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];

// image picker needs a delegate so we can respond to its messages
[imagePickerController setDelegate:self];
self.shouldCallViewWillAppear = NO;

if(IS_IOS8)
{
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        // Place image picker on the screen
        [self presentViewController:imagePickerController animated:YES completion:nil];
    }];
}
else
{
    [self presentViewController:imagePickerController animated:YES completion:nil];
}
UIImagePickerController *imagePickerController= [[UIImagePickerController alloc] init];
[imagePickerController setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];

// image picker needs a delegate so we can respond to its messages
[imagePickerController setDelegate:self];
self.shouldCallViewWillAppear = NO;

if(IS_IOS8)
{
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        // Place image picker on the screen
        [self presentViewController:imagePickerController animated:YES completion:nil];
    }];
}
else
{
    [self presentViewController:imagePickerController animated:YES completion:nil];
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X