2010-10-21 6 views
3

J'ai un contrôleur de navigation d'où je lance un ModalViewController. Dans ce ModalViewController, je vais afficher le MailComposer qui est lui-même un autre ModalViewController.Deux ModalViewController

Maintenant, si l'utilisateur clique sur le bouton d'envoi, MailComposerView doit être rejeté ainsi que l'autre ModalViewController. Pour cela j'appelle une méthode déléguée dans le mailComposerController.

Maintenant que la MailComposerView sera rejetée, mais pas l'autre ModalViewController et je reçois le message suivant d'erreur

attempt to dismiss modal view controller whose view does not currently appear. self = <UINavigationController: 0x724d500> modalViewController = <UINavigationController: 0x72701f0> 

Avez-vous une idée de ce que je fais mal?

Première ModalView

- (void)addList { 
NSLog(@"addList"); 

//AddListViewController *addListViewController = [[AddListViewController alloc] init]; 
AddListViewController *addListViewController = [[AddListViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
addListViewController.delegate = self; 

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:addListViewController]; 
navigationController.navigationBar.barStyle = UIBarStyleBlack; 
navigationController.navigationBar.translucent = YES; 
[self presentModalViewController:navigationController animated:YES]; 

[navigationController release]; 
[addListViewController release]; } 

Dans le AddListViewController appelant le MailView

MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init]; 
    mailComposer.mailComposeDelegate = self; 

    NSString *subject = [NSString stringWithFormat:@"Group invite for groupname: %@", @"mhm"]; 
    [mailComposer setSubject:subject]; 

    // Fill out the email body text 
    NSString *emailBody = @"This is an group invite bla bla"; 
    [mailComposer setMessageBody:emailBody isHTML:NO]; 

    [self presentModalViewController:mailComposer animated:YES]; 
    [mailComposer release]; 

Dans la méthode mailComposerController

[self.navigationController dismissModalViewControllerAnimated:YES]; 
[self.delegate finishAddList:checkmark andListName:listName.text]; 

Dans le délégué finsihAddList

[self dismissModalViewControllerAnimated:YES]; 

Répondre

3

Vous devez appeler le second renvoi avec un retard, car le premier rejet n'a pas encore été effectué lors de l'appel. Un retard de 0.0f est intentionnel, cela signifie qu'il sera fait dans la boucle d'événement suivante.

+0

Essayé mais toujours la même erreur [self.delegate performSelector: @selector (finishAddList :) withObject: listName.text afterDelay: 0.0f]; – gabac

+0

Avez-vous essayé de supprimer l'animation au second rejet? Et avez-vous essayé avec un plus grand retard? – jv42

+0

plus grande offre aide! merci beaucoup – gabac

8

J'ai eu un problème similaire. J'ai eu une pile de contrôleurs de vue modalement présentés. Quand j'essayais de les rejeter en commençant par le visible et en descendant la pile, j'échouais avec la même erreur. La solution consistait à rejeter le contrôleur de vue au bas de la pile. Il rejetterait tout au-dessus d'elle.

Dans votre cas, ma solution équivaudrait à changer la méthode mailComposerController pour qu'elle ne contienne qu'une seule ligne (ne rejette pas le contrôleur modal vie le plus haut).

[self.delegate finishAddList:checkmark andListName:listName.text]; 

Je sais que vous avez déjà résolu votre problème, mais que cela pourrait être utile pour d'autres.

+0

très bien! Merci beaucoup – gabac

+1

C'est une meilleure solution car elle n'implique pas de timing. –

Questions connexes