2009-12-16 14 views
44

Llamo a MFMailComposeViewController desde UITableViewController. El problema es que el método delegado nunca es llamado cuando selecciono Cancelar o Enviar botón en Mail componer ventana:No se puede cerrar MFMailComposeViewController, no se ha llamado al delegado

mailComposeController:(MFMailComposeViewController*)controllerdidFinishWithResult 

Aquí es la clase de vista tabla:

@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"); 
} 

La aplicación doesn' t choque. Después de presionar el botón Cancelar o Enviar, la Ventana de composición permanece en la pantalla con los botones desactivados. Puedo salir de la aplicación presionando la tecla Inicio.

Puedo abrir otras vistas modales de TableView pero no MailCompose.

Respuesta

14

Su firma del método es incorrecto:

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

debe ser:

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error 
+0

Creo que esto es solo un error en su pregunta. –

202

Asegúrese de utilizar

controller.mailComposeDelegate = self; 

y no

controller.delegate = self; 
+1

Se me pidió un buen consejo para que funcione. – maralbjo

+1

+1 ¡Gracias, funciona! – Saawan

+12

Desearía poder votar 20 veces. ¿Por qué harías esto, Apple? – Tim

4

Consulte este artículo para obtener la plena aplicación: http://www.ioscreator.com/tutorials/send-email-from-an-app

código de trabajo después de hacer retirar obsoleta uno:

#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 
+0

Este artículo es muy útil: http://www.ioscreator.com/tutorials/send-email-from-an-app – Rajeev

0

que enfrentan el mismo problema y fue en busca de una solución de últimos 2 días y luego me encontré con un mismo arreglar y no vas a creer lo insignificante que era.

En mi caso, el controlador de vista (digamos 'DetailsTableViewController' según esta pregunta) desde donde estaba presentando el MFMailComposeViewController ya se está presentando desde otro controlador de vista (digamos 'BaseViewController').

El problema estaba en el 'modalPresentationStyle' de 'DetailsTableViewController' al presentarlo desde BaseViewController.

En el momento en que lo cambié a 'UIModalPresentationFormSheet' a 'UIModalPresentationPageSheet' (de hecho cualquier cosa que no sea 'UIModalPresentationFormSheet') problema se resolvió y los métodos de delegado controlador electrónico comenzó a disparar como de costumbre.

Nota: Ya estaba llamando al siguiente método en 'DetailsTableViewController' (para este ejemplo) por lo que realmente no me importaba qué 'modalPresentationStyle' estaba usando.

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