example bar ios objective-c cocoa-touch mfmailcomposeviewcontroller

ios - bar - No se puede cerrar MFMailComposeViewController, delegar no llamado



uisearchbar swift 4 (4)

Asegúrate de usar

controller.mailComposeDelegate = self;

y no

controller.delegate = self;

Estoy llamando a MFMailComposeViewController desde un UITableViewController . El problema es que nunca se llama al método de delegado cuando selecciono el botón Cancelar o Enviar en la ventana de redacción de Correo:

mailComposeController:(MFMailComposeViewController*)controllerdidFinishWithResult

Aquí está la clase de vista de 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 no se cuelga. 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.


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

Código de trabajo después de hacer la eliminación de obsoleto:

#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


La firma de tu método es incorrecta:

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

Debiera ser:

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


Me enfrenté al mismo problema y estaba buscando una solución en los últimos 2 días, luego encontré una solución y no vas a creer lo insignificante que fue.

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

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

El momento en que lo cambié de '' UIModalPresentationFormSheet '' a '' UIModalPresentationPageSheet '' (para el caso, cualquier cosa que no sea '' UIModalPresentationFormSheet '') problema se resolvió y los métodos de delegado del controlador de correo comenzaron a activarse como de costumbre.

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

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