Ios7 ios:应用程序试图在目标上呈现无模式视图控制器

Ios7 ios:应用程序试图在目标上呈现无模式视图控制器,ios7,mfmailcomposeviewcontroller,Ios7,Mfmailcomposeviewcontroller,我正在开发一个应用程序,要求打开一个按钮点击UIAlertView的电子邮件作曲家 电子邮件消息正文中的消息是从UITextView复制的。我正在使用以下代码snipt: -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ if (buttonIndex == 0) { // opening message composer } else { M

我正在开发一个应用程序,要求打开一个按钮点击UIAlertView的电子邮件作曲家

电子邮件消息正文中的消息是从UITextView复制的。我正在使用以下代码snipt:

-(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];
}

但问题是,我得到的错误是,应用程序试图在目标上呈现一个无模式视图控制器。如何在ios 7中打开默认邮件生成器?

根据苹果的说法,您应该检查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];
}

Swift:

if MFMailComposeViewController.canSendMail() else {
// Send mail code
}
参考:


忘记设备设置中的邮件帐户配置也可能导致此错误。重新检查您的设备中是否配置了邮件帐户。

Swift 4版本

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

守卫机关岩石!但为什么文本消息(MFMessageComposeViewController)不需要此检查?我有一个没有sim卡的测试设备,从技术上讲,它应该不能发送文本,但在没有检查的情况下,它工作正常(没有引发异常)。。。为什么?谢谢。因此,不再在模拟器上测试发送邮件UI…?用户的设备可能没有配置电子邮件帐户。因此,在模拟器上进行测试可以抓住丢失的守卫。在添加
canSendMail
之后,我们将不得不依靠设备测试。