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.
Assurez-vous d'utiliser
controller.mailComposeDelegate = self;
et pas
controller.delegate = self;
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
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
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];
}