web-dev-qa-db-ja.com

ios:アプリケーションがターゲットにnilモーダルビューコントローラーを提示しようとしました

私はアプリケーションを開発しています。要件は、UIAlertViewのボタンクリックで電子メールcomposerを開くことです。

電子メールのメッセージ本文にあるメッセージは、UITextViewからコピーされます。私は次のコードの抜粋を使用しています:

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
if (buttonIndex == 0)
  {
      // opening message composer
  }
else
  {
   MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
    picker.mailComposeDelegate = self;
    [picker setSubject:@"Test mail"];
    [picker setMessageBody:messageBody.text isHTML:YES];
    [self presentViewController:picker animated:YES completion:NULL];
  }
}
 // mail compose delegate
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
      [self dismissViewControllerAnimated:YES completion:NULL];
}

しかし、問題は、アプリケーションがターゲットにnilモーダルビューコントローラーを表示しようとしたというエラーが発生することです。 iOS 7でデフォルトのメールを開く方法composer?

32

Appleによると、MFMailComposeViewControllerが送信直前にメールを送信できることを確認する必要があります

if ([MFMailComposeViewController canSendMail]) {
     MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
    picker.mailComposeDelegate = self;
    [picker setSubject:@"Test mail"];
    [picker setMessageBody:messageBody.text isHTML:YES];
    [self presentViewController:picker animated:YES completion:NULL];
}

参照: Apple Dev url


73
Toseef Khilji

デバイス設定でメールアカウントの設定を忘れた場合も、このエラーが発生する可能性があります。デバイスにメールアカウントが設定されているかどうかを再確認します。

10
prodeveloper

Swift 4バージョン

guard MFMailComposeViewController.canSendMail() else {
    print("Mail services are not available")
    return
}
sendEmail()
9
rockdaswift