2011-02-13 11 views
29

he configurar un MFMailComposeViewController y funciona muy bien en el iPhone, pero en el IPAD que se estrelle, diciendo:MFMailComposeViewController - IPAD

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

Así que ¿por qué este crear 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]; 

¿Alguna idea?

Respuesta

73

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

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

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

¿Pero por qué no se crearía? Estoy llamando alloc/init. – RyanJM

+19

Puede que no se cree, por ejemplo, si no hay configuración de cuenta de correo en el dispositivo – Vladimir

+1

Gracias Vladimir - tu comentario me ha guardado un desastre de depuración – Brodie

11

debe tener que poner comprobar canSendMail, antes de crear el objeto MFMailComposerViewController, consulte los siguientes comentarios de MFMailComposeViewController.h clase:

/*! 
@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); 

no será inicializado el objeto hasta que el dispositivo está configuración para enviar correos.

+1

Gracias. Eso lo haría. Este dispositivo funciona y, por lo tanto, no tiene configurada mi dirección de correo electrónico. ¡Buena atrapada! – RyanJM

2

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.

como 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]; 
} 

esperan su ayuda.

4
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.

-3

No hay una 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]; 
} 
Cuestiones relacionadas