MFMailComposeViewController在iOS 13模拟器和设备中的行为有所不同

时间:2019-11-01 09:32:44

标签: ios swift ios13 mfmailcomposeviewcontroller xcode11

我正在尝试在应用中显示MFMailComposeViewController

if MFMailComposeViewController.canSendMail() {
    let mailComposeViewController = MFMailComposeViewController()
    mailComposeViewController.navigationBar.tintColor = .white
    mailComposeViewController.mailComposeDelegate = self
    mailComposeViewController.setToRecipients(["support@gmail.com"])
    mailComposeViewController.setSubject("Feedback")
    present(mailComposeViewController, animated: true)
} else {
    print("This device is not configured to send email. Please set up an email account.")
}

在iOS 12中,它显示没有问题。在模拟器和设备中。

enter image description here

但是当我在运行iOS 13的设备上运行同一项目时,看起来像这样。

enter image description here

导航栏颜色消失了。另外,发送按钮也不可见。

所以我添加了mailComposeViewController.navigationBar.backgroundColor = .mv_primary,但是它仍然没有显示在设备上。奇怪的是,背景颜色显示在模拟器中。

但是有一个奇怪的行为。当我在模拟器中运行时,MFMailComposeViewController会立即自动消失。

enter image description here

Xcode控制台中也会显示以下错误。

  

[通用] [FBSSystemService] [0x5f27]处理以下请求的打开请求时出错   com.apple.MailCompositionService:{       userInfo = {           FBSOpenApplicationRequestID = 0x5f27;       }       底层错误=; } 2019-11-01   14:40:05.214158 + 0530 MailCompose [11289:262267] [声明]连接   请求无效而未恢复我们的_serviceSessionConnection。   这是一个错误。 2019-11-01 14:40:05.216901 + 0530   MailCompose [11289:262054] [常规] #CompositionServices   _serviceViewControllerReady:NSError Domain = _UIViewServiceInterfaceErrorDomain代码= 0

我猜奇怪的解雇错误是Xcode错误。但是,如何解决背景色和发送按钮未显示在设备中的问题?

这就是我设置所有与导航栏相关的样式的方式。

UINavigationBar.appearance().barTintColor = .mv_primary
UINavigationBar.appearance().tintColor = .white
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
if #available(iOS 11.0, *) {
    UINavigationBar.appearance().largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
}

Demo project

3 个答案:

答案 0 :(得分:0)

添加此行代码,然后再显示。它将正常工作。这是iOS 13中的更改

mailController.modalPresentationStyle = .fullScreen

答案 1 :(得分:0)

邮件编辑器立即撤消的原因是,您实际上无法从模拟器发送电子邮件。实现与iOS本身不同。

我想这里发生的是,虽然模拟器实现仅使用一些普通的UI元素,但本机iOS上的MFMailComposeViewController实际上是托管的{strong> ,例如UIDocumentPickerViewController或{{ 1}}。这意味着屏幕截图和尝试遍历视图树是不可能的,因为视图不是应用程序的实际部分。之所以这样做,是因为这些控制器包含用户私人信息。托管视图控制器不允许进行自定义,并且不符合您的全局UIActivityViewController。这可以解释为什么它确实显示在模拟器中而不是显示在您的本机设备上。

答案 2 :(得分:0)

这是iOS 13中的新UI样式。您可以在Storyboard中将其禁用,也可以手动设置。 Presenting modal in iOS 13 fullscreen