web-dev-qa-db-fra.com

UIPopovercontroller dealloc atteint alors que le popover est toujours visible

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?

111
Mikayil Abdullayev

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];
203
Felix

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

11
tarmes

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];
10
orafaelreis