2010-09-16 6 views
1

Existe-t-il un moyen d'appeler du code lorsqu'une vue modale est terminée?Notification UIV lorsque le modal UIImagePickerController est fermé?

EDIT:

Je suis désolé, je ne clarifiais plus tôt. J'essaie de rejeter un UIImagePickerController puis d'afficher un MFMailComposeViewController et d'attacher les données d'image à l'email. Quand je tente d'appeler

[self presentModalViewController: mailController]

juste après

[self dismissModalViewController];

Je reçois des erreurs et autres.

+0

Voir ma réponse pour la mise à jour. –

Répondre

5

Vous utilisez un modèle de délégué pour la vue modale pour informer celui qui l'a présenté quand il est terminé.

MyModalViewController.h:

@protocol MyModalViewControllerDelegate; 

@interface MyModalViewController : UIViewController 
{ 
    id<MyModalViewControllerDelegate> delegate; 
} 

@property (nonatomic, assign) id<MyModalViewControllerDelegate> delegate; 

@end 


@protocol MyModalViewControllerDelegate 
- (void)myModalViewControllerFinished:(MyModalViewController*)myModalViewController; 
@end 

MyModalViewController.m:

@synthesize delegate; 

// Call this method when the modal view is finished 
- (void)dismissSelf 
{ 
    [delegate myModalViewControllerFinished:self]; 
} 

ParentViewController.h:

#import "MyModalViewController.h" 

@interface ParentViewController : UIViewController <MyModalViewControllerDelegate> 
{ 
} 

ParentViewController.m:

- (void)presentMyModalViewController 
{ 
    MyModalViewController* myModalViewController = [[MyModalViewController alloc] initWithNibName:@"MyModalView" bundle:nil]; 
    myModalViewController.delegate = self; 
    [self presentModalViewController:myModalViewController animated:YES]; 
    [myModalViewController release]; 
} 

- (void)myModalViewControllerFinished:(MyModalViewController*)myModalViewController 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

EDIT:

Je ne l'ai pas utilisé UIImagePickerController, mais en regardant les documents, il semble que vous avez déjà la plupart du code fait pour vous, car il y a une classe UIImagePickerControllerDelegate existante qui a trois différents " "renvoyer" les rappels de délégué (bien que l'un soit obsolète). Donc, vous devriez créer votre classe ParentViewController (quelle qu'elle soit) implémenter le modèle UIImagePickerControllerDelegate, puis implémenter ces méthodes. Bien que chaque méthode fasse quelque chose de différent (puisque vous devez gérer quand l'utilisateur sélectionne réellement une image, ou si elle annule), chacun fera la même chose à la fin: appelez dismissModalViewControllerAnimated: pour fermer le sélecteur.

+0

Puis-je utiliser le modèle délégué avec des délégués personnalisés sur un UIImagePickerController? – Moshe

0

Vous devez rejeter le modalViewController en quelque sorte non? Soit un UIButton, ou par code:

- (void)dismissModalViewControllerAnimated:(BOOL)animated 

Dans le IBAction (par exemple délégué) pour la UIButton ou dans la méthode ci-dessus, quel que soit le code appellent que vous voulez.

+0

Vous voulez remplacer "- (void) dismissModalViewControllerAnimated: (BOOL) animated'? Je ne pense pas que cela fonctionnerait, voir mon édition. – Moshe

0

Je ne pense pas qu'il y ait une notification spécifique à laquelle on peut encore s'abonner, pour savoir quand l'animation est terminée, ... MAIS. Vous pouvez implémenter viewDidAppear: dans le contrôleur de vue qui a présenté la vue modale. C'est ce que je fais, quand j'utilise le (à UIImagePickerController assez similaire) ABPeoplePickerNavigationController.

Dans le rappel du sélecteur de personnes, je me souviens de la personne taraudés dans le sélecteur sur une variable d'instance, comme ceci:

- (void)callbackFromModalView:(id)dataFromModalView { 
    // remember dataFromModalView as I need it when dismissed 
    self.dataFromModalView = dataFromModalView; 

    // now initiate dismissal 
    [self dismissModalViewControllerAnimated:YES]; 
} 

puis, dans votre contrôleur de vue, mettre en œuvre ceci:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    if (self.dataFromModalView) { 
     //...present now view here 

     // don't forget to reset this one 
     self.dataFromModalView = nil; 
    } 
} 

En effet, vous utilisez la combinaison viewWillAppear: et la propriété dataFromModalView comme "notification sur la vue modale ignorée".

Questions connexes