2012-05-03 4 views
19

メールを送信するためのモーダルビューを開く単純なアプリケーションがあります。 Xcode 4.2とiOS 5を使用し、iOS Simulatorでテストしています。アプリがクラッシュする キャッチされていない例外 'NSInvalidArgumentException'のためアプリを終了します。理由:
'アプリケーションがターゲットにnilモーダルビューコントローラを表示しようとしました。
'アプリケーションがメールコンポーザーを開こうとしたときに、ターゲット上にモーダルビューコントローラを表示しようとしました'エラー/クラッシュ

ライン実行:私はオブジェクトのmailComposer」を初期化しているものの

[self presentModalViewController:mailComposer animated:YES]; 

を。

クラス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]; 
} 
... 
... 

任意のポインタしてください?

+0

ハ、意図されたヤンパー:p – preynolds

答えて

14
mailComposer = [[MFMessageComposeViewController alloc] init]; 

は、私の意見では、問題の原因です。シミュレータがSMSメッセージを送信する方法はないため、イニシャライザメソッドはNULLを返すことがあります。とにかく、電子メールを送ろうと思っていますので、あなたは使用する必要があると言います。

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

ありがとう! :)それは今うまく動作します! – Jean

+2

また、メッセージを送信できるかどうかは、MFMessageComposeViewControllerのcanSendTextを使用して確認できます。 – tokentoken

54

私も同様の問題が発生しました。私はMFMailComposeViewControllerのインスタンスを割り当て、それをモーダルで提示しようとしました。

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

メールオプションは、iPhoneの設定で無効になっていたので、これだった:私はまた、例外が発生しました。デバイスにメールアカウントが設定されていない場合も同様です。したがって、MFMailCompseViewControllerインスタンスはnilになり、モーダルで提示するとクラッシュする可能性があります。

この問題を回避するには、MFMailComposeViewControllercanSendMailメソッドを使用しました。

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

これは私の問題と優れた解決策でした。 – mbuc91

+4

+1私の問題もあります。私はちょうど 'if(mailView){...}' – Firo

関連する問題