Étrange problème avec UIDocumentInteractionController
Je ne sais pas quel mal avec ce code, mais à chaque fois, quand je lance l'application, après que le Menu est affiché, l'application crash.
NSString * path = [[NSBundle mainBundle] pathForResource:@"tung" ofType:@"doc"];
UIDocumentInteractionController *docController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:path]];
docController.delegate = self;
//[docController presentPreviewAnimated:YES];
CGRect rect = CGRectMake(0, 0, 300, 300);
[docController presentOptionsMenuFromRect:rect inView:self.view animated:YES];
Erreur que j'ai:
*** Fin de l'app en raison de uncaught exception 'NSGenericException',
raison: '-[UIPopoverController
dealloc] atteint au cours de la liste est
toujours visible.'
Que dois-je faire maintenant ?
Sur la ligne à laquelle l'erreur est-elle levée?
sur cette ligne: [docController presentOptionsMenuFromRect:rect inView:auto.vue animated:YES];
sur cette ligne: [docController presentOptionsMenuFromRect:rect inView:auto.vue animated:YES];
OriginalL'auteur Tùng Đỗ | 2010-05-26
Vous devez vous connecter pour publier un commentaire.
Pour afficher l'aperçu d'un document par l'intermédiaire d'un "jetable" UIDocumentInteractionController vous devez le conserver après interactionControllerWithURL et autorelease dans le UIDocumentInteractionControllerDelegate méthode documentInteractionControllerDiddismissoptionsmenu. Comme l'a remarqué par David Liu, libérant il va se planter. Mais autoreleasing œuvres. J'ai vérifié que le dealloc est en fait appelé.
Le code suivant devrait fonctionner:
OriginalL'auteur Christian Fries
En gros, c'est le vieux problème de gestion de mémoire.
[UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:path]]
retourne un autoreleased objet, donc ça sera autoreleased peu de temps après votre bloc de code de finitions. Je devine que c'est différent de lapresentModalViewController
ce qui permettra de conserver une copie pour vous, mais c'est un point de côté.Fondamentalement, vous avez besoin de les conserver avant de votre bloc de code se termine. Le plus ennuyeux de la partie est de garder la trace de ce que l'docController est fait de sorte que vous n'avez pas une fuite de mémoire. Vous aurez à vérifier le résultat de l'
[docController presentOptionsMenuFromRect:rect inView:self.view animated:YES];
Si elle revient PAS, cela signifie que le menu ne s'est jamais montré, et donc vous devriez faire un communiqué de presse sur lui tout de suite (si vous avez déjà fait la conserver).
Toutefois, si elle renvoie OUI, alors vous aurez besoin de mettre en œuvre le délégué des méthodes pour docController, et relâchez lorsque le menu est rejeté (dans ce cas, il serait quand:
- (void)documentInteractionControllerDidDismissOptionsMenu:(UIDocumentInteractionController *)controller
est appelée.
EDIT:
Je tiens à apporter une correction ici:
La réponse précédente plante si le menu est rejeté. Essentiellement, il y a pas vraiment une bonne façon de créer un jetable DocController. Au lieu de cela, je pense qu'il est préférable d'en créer un pour chaque fichier dont vous avez besoin dans le viewcontroller, et de libérer lorsque vous avez terminé. Sinon, vous allez courir dans une multitude de cas possibles où la DocController sera libéré trop tôt et s'est écrasé.
OriginalL'auteur David Liu
Cette erreur est provoquée (comme d'autres l'ont mentionné) par le
UIDocumentInteractionController
d'être libéré alors que la vue-contrôleur est toujours en fonction. C'est une simple erreur et la création d'une référence forte à ce point de vue contrôleur, dans un décompte de références de l'environnement, permettra de résoudre le problème. L'objet peut être libérées quand il n'est plus nécessaire de répondre à déléguer méthodes.La raison de ce qui est déroutant, c'est que certains autres outils de Cacao semblables en apparence n'ont pas besoin d'être conservés de la même manière. Par exemple
UIImagePickerController
ouUIActivityViewController
pourrait être créé et présenté à l'intérieur d'une méthode sans problème.La différence entre ces autres exemples et
UIDocumentInteractionController
est que les autres composantes sont toutes les sous-classes deUIViewController
. Lorsqu'ils sont poussés dans une pile de navigation ou présentés, ils sont conservés par la pile de navigation ou la présentation de-vue-contrôleur. Lorsqu'ils sont licenciés, que la référence est supprimée andy, ils sont libérés.UIDocumentInteractionController
n'est pas unUIViewController
. Au lieu de cela, il fournit la vue des contrôleurs qui peut afficher pertinentes de l'interface, mais surtout, ne le font pas (pour la bonne raison qu'elle serait la cause d'une conserver cycle) de conserver le document interaction contrôleur. À cause de cela, celui qui est de la création du document responsable du traitement doit également maintenir une forte référence à elle comme le temps qu'il faut par la présentation de l'interface.Cet exemple est essentiellement le même que l'on a accepté de répondre, mais à l'aide de l'ARC amicale de style de retenir un objet.
OriginalL'auteur Anthony Mattox
SWIFT 3
Contrôleur de variable:
Appel de la méthode:
OriginalL'auteur Mikel Sanchez
Avec Christian technique...
Si vous décidez de lancer différents fichiers Pdf à partir de différents boutons dans la vue plutôt que de partir de la barre de navigation, ne pas utiliser:
[contrôleur autorelease];
Car il va supprimer le contrôleur, donc d'autres instances ne fonctionne pas après la première utilisation.
Mais si vous l'utilisez, vous voudrez peut-être dire
[self.contrôleur de autorelease];
OriginalL'auteur JulianB
J'ai résolu ce problème par la création d'une propriété et de l'utilisation de ce code.
La dismissMenuAnimated est important de prévenir la UIPopover Dealloc erreur. La plus commune de la survenance de l'erreur a été lorsque la liste a été toujours à l'affiche, et vous avez appuyé sur le bouton de nouveau pour afficher la liste.
OriginalL'auteur EquiAvia Tech