我正在尝试在应用中显示MFMailComposeViewController
。
if MFMailComposeViewController.canSendMail() {
let mailComposeViewController = MFMailComposeViewController()
mailComposeViewController.navigationBar.tintColor = .white
mailComposeViewController.mailComposeDelegate = self
mailComposeViewController.setToRecipients(["[email protected]"])
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中,它显示没有问题。在模拟器和设备中。
但是当我在运行iOS 13的设备上运行同一项目时,看起来像这样。
导航栏颜色消失了。发送按钮也将不可见。
所以我添加了mailComposeViewController.navigationBar.backgroundColor = .mv_primary
,但它仍未显示在设备上。奇怪的是,背景色显示在模拟器中。
但是有一种奇怪的行为。当我在模拟器中运行时,MFMailComposeViewController
会立即自动消失。
以下错误也出现在Xcode控制台中。
[Common] [FBSSystemService] [0x5f27]处理以下请求的打开请求时出错com.apple.MailCompositionService:{userInfo = {FBSOpenApplicationRequestID = 0x5f27;}底层错误=; } 2019-11-0114:40:05.214158 + 0530 MailCompose [11289:262267] [声明]连接请求无效而未恢复我们的_serviceSessionConnection。这是一个错误。 2019-11-01 14:40:05.216901 + 0530MailCompose [11289:262054] [常规] #CompositionServices_serviceViewControllerReady:NSError域= _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]
}
在显示之前添加此行代码。它将正常工作。这是iOS 13中的更改
mailController.modalPresentationStyle = .fullScreen
邮件编辑器立即退出的原因是,您实际上无法从模拟器发送电子邮件。实现与iOS本身不同。
我想这里发生的是,尽管模拟器实现仅使用一些常规UI元素,但本机iOS上的MFMailComposeViewController
实际上是[[托管,例如UIDocumentPickerViewController
或UIActivityViewController
。这意味着屏幕截图和尝试遍历视图树是不可能的,因为视图不是应用程序的实际部分。之所以这样做,是因为这些控制器包含用户私人信息。托管视图控制器不允许自定义,并且不符合您的全局UINavigationBar.appearance()
。这可以解释为什么它确实显示在模拟器中而不是显示在您的本机设备上。