iphone - cocoa touch tutorial
''La aplicación intentó presentar un controlador de vista modal nulo en el destino'' error/bloqueo al intentar abrir el editor de correo (2)
También me he encontrado con un problema similar. MFMailComposeViewController
una instancia de MFMailComposeViewController
y traté de presentarlo de manera modal. También tengo 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. Puede ser el caso también cuando no se configura una cuenta de correo en el dispositivo. Por lo tanto, la instancia de MFMailCompseViewController
será nil
y su presentación de forma modal causará el bloqueo.
Utilicé el método canSendMail
de MFMailComposeViewController
para MFMailComposeViewController
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];
}
}
Tengo una aplicación simple, que abre una vista modal para enviar correo electrónico. Estoy usando Xcode 4.2 y iOS 5, y estoy probando con el simulador de iOS. La aplicación falla con la aplicación de terminación debido a la excepción no detectada ''NSInvalidArgumentException'', motivo
''La aplicación intentó presentar un controlador de vista modal nula 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:@"[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];
}
...
...
¿Algún puntero por favor?
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];