Error/bloqueo "La aplicación intentó presentar un controlador de vista modal nulo en el destino" al intentar abrir el editor de correo

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?

preguntado el 03 de mayo de 12 a las 17:05

¿Algún consejo? Ja, sin juego de palabras :p -

2 Respuestas

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

 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 or haz tu propia pregunta.