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.