Подтвердить что ты не робот

"При попытке открыть почтовый композитор приложение попыталось представить ошибку" 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];
}
...
...

Любые указатели, пожалуйста?

4b9b3361

Ответ 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];
    }
}