23

メールを送信するためのモーダルビューを開くシンプルなアプリがあります。Xcode4.2とiOS5を使用しており、iOSSimulatorでテストしています。キャッチされない例外「NSInvalidArgumentException」が原因でアプリが終了するとアプリがクラッシュし ます。理由: 「アプリケーションがターゲットにnilモーダルビューコントローラーを提示しようとしました。」

行を実行するとき:

 [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:@"user@company.com"];

    [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];
}
...
...

何かポインタをお願いしますか?

4

2 に答える 2

57

私も同様の問題に遭遇しました。のインスタンスを割り当てて、MFMailComposeViewControllerモーダルに表示しようとしました。私も例外がありました:

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

これは、iPhoneの設定でメールオプションが無効になっているためです。デバイスにメールアカウントが設定されていない場合も同様です。したがって、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];
    }
}
于 2012-06-05T05:29:52.437 に答える
15
 mailComposer = [[MFMessageComposeViewController alloc] init];

私の意見では、問題の原因です。シミュレータがSMSメッセージを送信する方法がないため、初期化メソッドがNULLを返す場合があります。とにかく、そうはメールを送りたがっているようですので、使う必要があると思います

 mailComposer = [[MFMailComposeViewController alloc] init];
于 2012-05-03T16:35:28.040 に答える