ios:应用程序试图在目标上呈现一个 nil 模态视图控制器

Posted

技术标签:

【中文标题】ios:应用程序试图在目标上呈现一个 nil 模态视图控制器【英文标题】:ios: Application tried to present a nil modal view controller on target 【发布时间】:2013-10-08 04:24:36 【问题描述】:

我正在开发一个应用程序,要求是通过单击 UIAlertView 按钮打开电子邮件编写器。

邮件正文中的消息是从 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 中打开默认邮件编辑器?

【问题讨论】:

【参考方案1】:

根据 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];


斯威夫特:

if MFMailComposeViewController.canSendMail() else 
// Send mail code

参考:Apple Dev url


【讨论】:

保护机制动摇了! 但是为什么短信(MFMessageComposeViewController)不需要这个检查呢?我有一个没有 sim 卡的测试设备,从技术上讲它不应该能够发送文本,但是没有检查它可以正常工作(没有抛出异常)......为什么?谢谢。 那么,不用再在模拟器上测试发送邮件 UI了...? 用户的设备可能没有配置电子邮件帐户。因此,在模拟器上进行测试可以抓住缺失的守卫。添加canSendMail后,我们将不得不依赖设备测试。【参考方案2】:

Swift 4 版本

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

sendEmail()

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于ios:应用程序试图在目标上呈现一个 nil 模态视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

应用程序试图在目标上呈现一个 nil 模态视图控制器

** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“应用程序试图在目标上呈现一个 nil 模态视图控制器

应用程序试图在目标 <UIApplicationRotationFollowingController: 0x100c75280> 上呈现一个 nil 模态视图控制器

Redlaser SDK 和 nil 模态视图控制器

iOS UISearchController 崩溃:应用程序试图在自身上呈现模态视图控制器

ios导航错误使用按钮