2009-08-08 4 views
2

J'ai une application où j'affiche le sélecteur de photos (UIImagePickerController) mais après que l'utilisateur le rejette, seules les touches simples fonctionnent. Et je pense que je connais la racine du problème, mais je ne sais pas comment le résoudre ... Avant que je montre la boîte de dialogue modale la pile au cours d'une touche est la suivante:Après avoir affiché et rejeté le contrôleur Modal View UIImagePickerController mon application iPhone Cocos2d ne voit plus plusieurs touches

 
... 
#3 0x00074de0 in -[EAGLView touchesBegan:withEvent:] at EAGLView.m:289 
#4 0x30910f33 in -[UIWindow _sendTouchesForEvent:] 
... 

Mais après avoir montré et puis de retirer la boîte de dialogue modale la pile a ces deux mystérieux appels forwardMethod2:

 
... 
#3 0x00074de0 in -[EAGLView touchesBegan:withEvent:] at EAGLView.m:289 
#4 0x3098dc95 in forwardMethod2 
#5 0x3098dc95 in forwardMethod2 
#6 0x30910f33 in -[UIWindow _sendTouchesForEvent:] 
... 

Voici le code que j'utilise pour afficher et supprimer le UIImagePickerController: notes: 1. pickerViewController est membre de cette classe qui étend UIViewController) 2. Director est de Cocos2D et contient seulement un vue unique attachée directement dans la fenêtre racine appelée OpenGLView, ce qui explique pourquoi j'ai fait un UIViewController pour héberger mon sélecteur d'image.

-(void)choosePhoto: (id)sender{ 
    UIImagePickerController *imagePickerController = pickerViewController.imagePickerController; 
    imagePickerController.delegate = self; 
    imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
    imagePickerController.allowsImageEditing = YES; 

    UIView *theView = [[Director sharedDirector] openGLView]; 
    UIView *pickerViewControllerView = pickerViewController.view; 
    [theView addSubview:pickerViewControllerView]; 
    [pickerViewController presentModalViewController:imagePickerController animated:YES]; 
} 

Et le code pour rejeter la boîte de dialogue:

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)imagePickerController 
{ 
    // Dismiss the image selection 
    [pickerViewController dismissModalViewControllerAnimated:YES]; 
    [pickerViewController.view removeFromSuperview]; 

    // HERE... IS THERE MORE WORK TO BE DONE TO COMPLETELY REMOVE THE PICKER VIEW???? 
} 

Il doit y avoir quelque chose qui me manque dans le nettoyage de la vue ... sélecteur d'aide est grandement appréciée :)

+0

Êtes-vous sûr de devoir faire l'addSubView? Je ne pense pas que ce soit nécessaire, et j'essayerais de l'enlever pour voir si cela provoque un comportement étrange. –

+0

Oui, retirer cette partie ne montre jamais le dialogue. Parce que "self" n'est pas un viewController et sinon mon application n'utilise pas ViewControllers pour quoi que ce soit, je dois en faire un et l'ajouter à ma vue existante. –

Répondre

4

Après En examinant la hiérarchie des vues depuis la fenêtre racine, j'ai trouvé qu'après avoir ignoré le sélecteur de photos que la vue de mon viewController était ajoutée en tant qu'enfant sous UITransitionView, la solution consiste à supprimer la vue en superposition de la vue de viewController:

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)imagePickerController 
{ 
    // Dismiss the image selection 
    [pickerViewController dismissModalViewControllerAnimated:YES]; 
    [pickerViewController.view.superview removeFromSuperview]; 
} 
+0

Avait ce problème à et votre solution l'a réparé. Je me gratte la tête depuis des lustres. –

2

J'ai remarqué que la solution de CJ Hanson travaille pour moi sur les iPhones:

[pickerViewController.view.superview removeFromSuperview]; 

mais pas sur iPads. La manière normale:

[pickerViewController.view removeFromSuperview]; 

fonctionne sur l'iPad. Je viens d'appeler aussi bien au moment et il semble bien fonctionner:

[pickerViewController.view removeFromSuperview]; 
[pickerViewController.view.superview removeFromSuperview]; 

Peut-être que quelqu'un avec plus de connaissances peut expliquer pourquoi cela est nécessaire?

Questions connexes