2012-05-03 6 views
19

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 se bloquea con Aplicación de finalización debido a la excepción no detectada 'NSInvalidArgumentException', razón:
'La aplicación intentó presentar un controlador de vista modal nulo en el destino .'
'La aplicación intentó presentar un controlador de vista modal nulo en el destino' error/crash al intentar abrir el compositor de correo

cuando ejecuta la línea:

[self presentModalViewController:mailComposer animated:YES]; 

aunque he inicializado el objeto 'mailComposer'.

com_FirstViewController.m Clase:

#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:@"[email protected]"]; 

    [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]; 
} 
... 
... 

Cualquier punteros por favor?

+0

¿Alguna sugerencia? Ha, sin juego de palabras: p – preynolds

Respuesta

14
mailComposer = [[MFMessageComposeViewController alloc] init]; 

es la fuente del problema, en mi opinión. No hay manera de que el simulador envíe mensajes SMS, por lo que el método de inicialización puede devolver NULL. De todas formas, parece que quieres enviar un correo electrónico, así que diría que necesitas usar

mailComposer = [[MFMailComposeViewController alloc] init]; 
+0

¡Muchas gracias! :) ¡Funciona bien ahora! – Jean

+2

Además, puede verificar si puede enviar un mensaje o no, usando canSendText of MFMessageComposeViewController. – tokentoken

54

También he encontrado un problema similar. Asigné una instancia de MFMailComposeViewController y traté de presentarla de manera modal. También me dio 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 la opción Mail fue desactivado en los ajustes del iPhone. También puede ser el caso cuando no se configura una cuenta de correo en el dispositivo. Entonces, la instancia MFMailCompseViewController será nil y presentarla modalmente causará la falla.

Utilicé el método canSendMail del 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]; 
    } 
} 
+1

Este fue mi problema y una excelente solución. – mbuc91

+4

+1 mi problema también. Excepto que acabo de usar 'if (mailView) {...}' – Firo

Cuestiones relacionadas