"При попытке открыть почтовый композитор приложение попыталось представить ошибку" error/crash "диспетчера nil modal view at target
У меня есть простое приложение, которое открывает модальное представление для отправки электронной почты. Я использую Xcode 4.2 и iOS 5, и тестирую с помощью iOS Simulator. Приложение вылетает с Завершение приложения из-за неотображенного исключения "NSInvalidArgumentException", причина:
"Приложение попыталось представить контроллер потока nil modal view .
при выполнении строки:
[self presentModalViewController:mailComposer animated:YES];
хотя я инициализировал объект 'mailComposer'.
Класс 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];
}
...
...
Любые указатели, пожалуйста?
Ответы
Ответ 1
mailComposer = [[MFMessageComposeViewController alloc] init];
является источником проблемы, на мой взгляд. Симулятор не может отправлять SMS-сообщения, поэтому метод инициализатора может возвращать NULL. В любом случае, су, похоже, хочет отправить электронное письмо, поэтому я бы сказал, что вам нужно использовать
mailComposer = [[MFMailComposeViewController alloc] init];
Ответ 2
Я также столкнулся с аналогичной проблемой. Я выделил экземпляр MFMailComposeViewController
и попытался представить его модально. У меня также есть исключение:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present a nil modal view controller on target
Это связано с тем, что в настройках iPhone отключена опция Mail. Это может иметь место и при отсутствии на устройстве почтовой учетной записи. Таким образом, экземпляр MFMailCompseViewController
будет nil
, и его представление по тексту приведет к сбою.
Я использовал метод canSendMail
для MFMailComposeViewController
, чтобы обойти эту проблему.
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];
}
}