Je vous assure que j'ai cherché une réponse dans SO pour ma question mais aucune n'a été utile. Ici, j'ai obtenu un code simple qui devrait présenter un UIImagePickerController
dans un UIPopoverController
:
-(void)takePicture:(id)sender{
UIImagePickerController *picker=[[UIImagePickerController alloc] init];
picker.delegate=self;
picker.sourceType=UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing=YES;
UIPopoverController *poc=[[UIPopoverController alloc]
initWithContentViewController:picker];
[poc presentPopoverFromBarButtonItem:bbItem
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:NO];
}
Maintenant, même la première fois que je reçois [UIPopoveController dealloc]
atteint pendant ... erreur et le programme plante. Je ne fais aucune conservation, relâchement ou libération automatique selon ARC. Y a-t-il une considération particulière avec UIPopoverControllers
lorsque vous bénéficiez d'ARC?
UIPopoverControllers doit toujours être conservé dans une variable d'instance. C'est une bonne pratique de lui créer une propriété solide.
MISE À JOUR:
Depuis iOS 8, vous devriez utiliser UIPopoverPresentationController
. Ensuite, vous n'avez pas besoin de conserver une référence au popover car il est géré par le contrôleur de présentation.
Exemple de code (fonctionne à la fois sur iPhone et iPad):
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing = YES;
picker.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController* popoverPC = picker.popoverPresentationController;
popoverPC.barButtonItem = bbItem;
popoverPC.permittedArrowDirections = UIPopoverArrowDirectionAny;
[self presentViewController:picker animated:YES completion:nil];
Lorsque la fonction se termine, il n'y a plus d'autre référence au contrôleur popover, il est donc désalloué trop tôt.
Essayez plutôt de l'ajouter en tant que membre de votre classe.
Tim
En ajoutant ce à quoi @ phix23 a répondu, créez une propriété * poc comme ceci:
@property (nonatomic, retain) IBOutlet UIPopoverController *poc;
puis changer
UIPopoverController *poc = [[UIPopoverController alloc]
initWithContentViewController:picker];
for
self.poc = [[UIPopoverController alloc]
initWithContentViewController:picker];