Error/bloqueo "La aplicación intentó presentar un controlador de vista modal nulo en el destino" al intentar abrir el editor de correo
Frecuentes
Visto 25,638 veces
23
Tengo una aplicación simple, que abre una vista modal para enviar correos electrónicos. Estoy usando Xcode 4.2 e iOS 5, y estoy probando con iOS Simulator. La aplicación falla con
Finalización de la aplicación debido a la excepción no detectada 'NSInvalidArgumentException', motivo:
'La aplicación intentó presentar un controlador de vista modal nulo en el destino.'
al ejecutar la línea:
[self presentModalViewController:mailComposer animated:YES];
aunque he inicializado el objeto 'mailComposer'.
Clase com_FirstViewController.m :
#import "com_FirstViewController.h"
...
@implementation com_FirstViewController
....
....
-(void)showEmailComposer {
Class mailClass = (NSClassFromString(@"MFMailComposeViewController"));
if (mailClass != nil)
{
if ([mailClass canSendMail]) {
NSLog(@"showEmailComposer: Calling displayComposerSheet");
[self displayComposerSheet];
} else {
NSLog(@"showEmailComposer: Calling launchMailAppOnDevice");
[self launchMailAppOnDevice];
}
}
else {
NSLog(@"showEmailComposer: Calling launchMailAppOnDevice");
[self launchMailAppOnDevice];
}
}
#pragma mark -
#pragma mark Compose Mail
-(void) displayComposerSheet {
mailComposer = [[MFMessageComposeViewController alloc] init];
mailComposer.messageComposeDelegate = self;
// Set the mail title
[mailComposer setTitle:@"Mail Title"];
// Set the recipients
NSArray *toRecipients = [NSArray arrayWithObject:@"user@company.com"];
[mailComposer setRecipients:toRecipients];
// EMail Body
NSString *mailBody = @"This is the mail body";
[mailComposer setBody:mailBody];
NSLog(@"present the modal view ctlr");
[self presentModalViewController:mailComposer animated:YES];
}
...
...
¿Algún consejo, por favor?
2 Respuestas
57
También me he encontrado con un problema similar. Asigné una instancia de MFMailComposeViewController
y trató de presentarlo modalmente. También obtuve una excepción:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present a nil modal view controller on target
Esto se debió a que la opción Correo estaba deshabilitada en la configuración del iPhone. También puede ser el caso cuando no se configura una cuenta de correo en el dispositivo. Entonces el MFMailCompseViewController
instancia será nil
y presentarlo de manera modal provocará el bloqueo.
He utilizado el canSendMail
método de la MFMailComposeViewController
para solucionar este problema.
Class mailClass = (NSClassFromString(@"MFMailComposeViewController"));
if (mailClass != nil) {
MFMailComposeViewController * mailView = [[MFMailComposeViewController alloc] init];
mailView.mailComposeDelegate = self;
//Set the subject
[mailView setSubject:emailSubject];
//Set the mail body
[mailView setMessageBody:emailBody isHTML:YES];
//Display Email Composer
if([mailClass canSendMail]) {
[self.navControl presentModalViewController:mailView animated:YES];
}
}
respondido 19 nov., 14:10
15
mailComposer = [[MFMessageComposeViewController alloc] init];
es la fuente del problema, en mi opinión. No hay forma de que el simulador pueda enviar mensajes SMS, por lo que el método de inicialización puede devolver NULL. De todos modos, parece que quieres enviar un correo electrónico, así que diría que necesitas usar
mailComposer = [[MFMailComposeViewController alloc] init];
contestado el 03 de mayo de 12 a las 17:05
Además, puede verificar si puede enviar mensajes o no, usando canSendText de MFMessageComposeViewController. - tokentoken
En mi opinión, la fuente del problema es no verificar el método canSendMail de MFMailComposeViewController. Si marca esto (o puede enviar texto, según corresponda) antes de continuar, su código no fallará, ya sea que Mail o Messages estén disponibles o no. - Andrés
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas iphone cocoa-touch or haz tu propia pregunta.
¿Algún consejo? Ja, sin juego de palabras :p - preynolds