web-dev-qa-db-ja.com

MFMailComposeViewController-iPad

MFMailComposeViewControllerをセットアップしましたが、iPhoneでは問題なく動作しますが、iPadでは次のようにクラッシュします。

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

では、なぜこれがnilモーダルビューを作成するのでしょうか?

    MFMailComposeViewController *message = [[MFMailComposeViewController alloc] init];
    [message setMessageBody:@"My message here"  isHTML:NO];
    [message setToRecipients:[NSArray arrayWithObject:@"[email protected]"]];
    [message setSubject:@"Request Info"];
    message.mailComposeDelegate = self;
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        message.modalPresentationStyle = UIModalPresentationFormSheet;
    [self presentModalViewController:message animated:YES];
    [message release];

何か案は?

31
RyanJM

MFMailComposeViewControllerのようなLoosは何らかの理由で作成されなかったため、nilの値があります。表示する前に、それがnilであるかどうかを確認してください(ただし、この回避策では、ここで問題が発生したことには答えられません...)。

また、+canSendMailメソッドを使用してメールを作成および提示する前に、メールcomposerがメールを送信できるかどうかを確認する必要があります(たとえば、デバイスにメールアカウントが設定されていない場合はNOが返されます)。 )::

 if ([MFMailComposeViewController canSendMail]){
    // Create and show composer
 }
 else{
   // Show some error message here
 }
73
Vladimir

canSendMailオブジェクトを作成する前に、MFMailComposerViewControllerをチェックする必要があります。MFMailComposeViewController.hクラス:

/*!
@method     canSendMail
@abstract   Returns <tt>YES</tt> if the user has set up the device for sending email.
@discussion The client may continue to set the recipients and content if the return value was <tt>YES</tt>.  If <tt>NO</tt>
            was the result, the client has a couple options.  It may choose to simply notify the user of the inability to
            send mail, or it may issue a "mailto" URL via <tt>-[UIApplication openURL:]</tt>.
*/

+ (BOOL)canSendMail __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);

デバイスがメールを送信するように設定されるまで、オブジェクトは初期化されません。

11
Ansari
if ([MFMailComposeViewController   canSendMail]){
    //execute  your    code 
else{
    UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"No mail account setup on device" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];     
    [anAlert addButtonWithTitle:@"OK"];
    [anAlert show];
}

アラートが表示された場合は、電話でメールアカウントを構成してください。

4
anand madhav

IOSのデフォルトのメールアプリがまだメールIDで構成されていないために発生します。したがって、任意のメールIDで構成して試してください。

このような

if ([MFMailComposeViewController canSendMail]){
    MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
    controller.mailComposeDelegate = self;
    [controller setToRecipients:[NSArray arrayWithObject:eMail]];
    [self presentViewController:controller animated:YES completion:nil];
}
else{
    UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"error" message:@"No mail account setup on device" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
    [anAlert addButtonWithTitle:@"Cancel"];
    [anAlert show];
}

それがあなたの助けになることを願っています。