web-dev-qa-db-fra.com

Impossible de rejeter MFMailComposeViewController, délégué non appelé

J'appelle MFMailComposeViewController à partir d'une UITableViewController. Le problème est que la méthode de délégation n'est jamais appelée lorsque je sélectionne Annuler ou Bouton Envoyer dans la fenêtre de composition du courrier: 

mailComposeController:(MFMailComposeViewController*)controllerdidFinishWithResult 

Voici la classe de vue de table:

@implementation DetailsTableViewController
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section==0 && indexPath.row==4) {
        //SEND MAIL
        MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
        controller.mailComposeDelegate = self;
        if ([MFMailComposeViewController canSendMail]) {
            [controller setSubject:[NSString stringWithFormat:@"Ref %@",[item objectForKey:@"reference"]]];
            [controller setMessageBody:@" " isHTML:NO]; 
            [controller setToRecipients:[NSArray arrayWithObject:[item objectForKey:@"email"]]]; 
            [self presentModalViewController:controller animated:YES];
        }
        [controller release];       
    }
}

- (void)mailComposeController:(MFMailComposeViewController*)controllerdidFinishWithResult:(MFMailComposeResult)result error:(NSError*)error {
    // NEVER REACHES THIS PLACE
    [self dismissModalViewControllerAnimated:YES];
    NSLog (@"mail finished");
}

L'application ne plante pas. Après avoir appuyé sur le bouton Annuler ou Envoyer, la fenêtre de composition reste à l'écran avec les boutons désactivés. Je peux quitter l'application en appuyant sur la touche Accueil.

Je suis capable d'ouvrir d'autres vues modales sous forme de TableView mais pas MailCompose.

47
Rod

Assurez-vous d'utiliser 

controller.mailComposeDelegate = self;

et pas

controller.delegate = self;
211
mxg

La signature de votre méthode est incorrecte:

- (void)mailComposeController:(MFMailComposeViewController*)controllerdidFinishWithResult:(MFMailComposeResult)result error:(NSError*)error

Devrait être:

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
14
Chris Gummer

Reportez-vous à cet article pour une mise en œuvre complète: http://www.ioscreator.com/tutorials/send-email-from-an-app

code de travail après avoir retiré le code obsolète: 

#import <MessageUI/MFMailComposeViewController.h>

@interface SettingsTableViewController () <MFMailComposeViewControllerDelegate, UITextFieldDelegate, UITextViewDelegate>

@end


@implementation SettingsTableViewController
// add default methods

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSInteger sectionNum = indexPath.section;
    NSInteger rowNum = indexPath.row;
    if (sectionNum == 2 && rowNum == 1) {
        MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
        controller.mailComposeDelegate = self;
        if ([MFMailComposeViewController canSendMail]) {
            [controller setSubject:[NSString stringWithFormat:@"Invitation to Northstar app"]];
            [controller setMessageBody:@" " isHTML:NO];
//            [controller setToRecipients:[NSArray arrayWithObject:[item objectForKey:@"email"]]];
            //presentViewController:animated:completion:
            [self presentViewController:controller animated:YES completion:NULL];
        }
    }
}
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{        
    NSLog (@"mail finished");
    [self dismissViewControllerAnimated:YES completion:NULL];
}

@end
4
Rajeev

J'ai rencontré le même problème et je cherchais une solution depuis 2 jours, puis j'ai trouvé une solution moi-même et vous ne croirez pas à quel point c'était mineur.

Dans mon cas, le contrôleur de vue (dites 'DetailsTableViewController' conformément à cette question) à partir duquel je présentais la MFMailComposeViewController est déjà présenté par un autre contrôleur de vue (dites 'BaseViewController'). 

Le problème se trouvait dans la 'modalPresentationStyle' de 'DetailsTableViewController' lors de sa présentation à partir de BaseViewController.

Au moment où je l'ai changé de 'UIModalPresentationFormSheet' à 'UIModalPresentationPageSheet' (pour toute question autre que 'UIModalPresentationFormSheet'), le problème a été résolu et les méthodes de délégation du contrôleur de messagerie ont commencé à fonctionner comme d'habitude.

Remarque: J'appelais déjà la méthode ci-dessous dans 'DetailsTableViewController' (pour cet exemple), donc peu importait pour moi 'modalPresentationStyle' que j'utilisais.

    - (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    self.view.superview.bounds = CGRectMake(0, 0, 1024, 768);
    self.view.superview.backgroundColor = [UIColor clearColor];
}
0
Rajesh