私はアプリケーションを開発しています。要件は、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?
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
デバイス設定でメールアカウントの設定を忘れた場合も、このエラーが発生する可能性があります。デバイスにメールアカウントが設定されているかどうかを再確認します。
Swift 4バージョン
guard MFMailComposeViewController.canSendMail() else {
print("Mail services are not available")
return
}
sendEmail()