mfmailcomposeviewcontrollerdelegate ipad mfmailcomposeviewcontroller

mfmailcomposeviewcontrollerdelegate - MFMailComposeViewController-iPad



swift 3 send email (5)

Debe tener que verificar si canSendMail , antes de crear el objeto MFMailComposerViewController , consulte los siguientes comentarios de la clase MFMailComposeViewController.h :

/*! @method canSendMail @abstract Returns <tt>YES</tt> if the user has set up the device for sending email. @discussion The client may continue to set the recipients and content if the return value was <tt>YES</tt>. If <tt>NO</tt> was the result, the client has a couple options. It may choose to simply notify the user of the inability to send mail, or it may issue a "mailto" URL via <tt>-[UIApplication openURL:]</tt>. */ + (BOOL)canSendMail __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);

Su objeto no se inicializará hasta que su dispositivo esté configurado para enviar correos.

Configuré un MFMailComposeViewController y funciona bien en el iPhone, pero en el iPad falla, y dice:

*** Terminating app due to uncaught exception ''NSInvalidArgumentException'', reason: ''Application tried to present a nil modal view controller on target...

Entonces, ¿por qué esto crearía una vista modal nula?

MFMailComposeViewController *message = [[MFMailComposeViewController alloc] init]; [message setMessageBody:@"My message here" isHTML:NO]; [message setToRecipients:[NSArray arrayWithObject:@"[email protected]"]]; [message setSubject:@"Request Info"]; message.mailComposeDelegate = self; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) message.modalPresentationStyle = UIModalPresentationFormSheet; [self presentModalViewController:message animated:YES]; [message release];

¿Algunas ideas?


Loos como MFMailComposeViewController no se creó por alguna razón y, por lo tanto, tiene un valor nil . Compruebe si es nula antes de presentarlo (aunque esta solución no responde a lo que salió mal aquí ...).

También debe realizar el control si el compositor de correo puede enviar correo antes de intentar crear y presentarlo usando el método +canSendMail (devolverá NO, por ejemplo, si no se configuró una cuenta de correo en el dispositivo):

if ([MFMailComposeViewController canSendMail]){ // Create and show composer } else{ // Show some error message here }


Ninguna cuenta de correo configurada en su dispositivo de prueba.

if ([MFMailComposeViewController canSendMail]){ //execute your code else{ UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"error" message:@"No mail account setup on device" delegate:self cancelButtonTitle:nil otherButtonTitles:nil]; [anAlert addButtonWithTitle:@"Cancel"]; [anAlert show]; }


Sucede porque la aplicación de correo predeterminada de iOS aún no se configuró con ninguna identificación de correo. así que configure con cualquiera de su id de correo y pruebe.

Me gusta esto

if ([MFMailComposeViewController canSendMail]){ MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init]; controller.mailComposeDelegate = self; [controller setToRecipients:[NSArray arrayWithObject:eMail]]; [self presentViewController:controller animated:YES completion:nil]; } else{ UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"error" message:@"No mail account setup on device" delegate:self cancelButtonTitle:nil otherButtonTitles:nil]; [anAlert addButtonWithTitle:@"Cancel"]; [anAlert show]; }

espero que te ayude


if ([MFMailComposeViewController canSendMail]){ //execute your code else{ UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"No mail account setup on device" delegate:self cancelButtonTitle:nil otherButtonTitles:nil]; [anAlert addButtonWithTitle:@"OK"]; [anAlert show]; }

Si recibe una alerta, configure su cuenta de correo en su teléfono.