ios - 尝试从应用程序快速发送电子邮件
问题描述
我正在尝试在 myViewController 上显示电子邮件弹出窗口,但出现错误
使用未解析的标识符“存在”
在线上
现在(作曲家,动画:真)
值得注意的是,该按钮位于 collectionView 单元格中。我将如何解决此错误,以便当我按下按钮时,电子邮件概述将显示在屏幕上?
这是我的代码。
import MessageUI
class MessagesViewCell: UICollectionViewCell, MFMailComposeViewControllerDelegate {
@IBOutlet weak var textLabel: UILabel!
@IBOutlet weak var imageView: UIImageView!
@IBAction func emailButtonTapped(_ sender: Any) {
showMailComposer()
}
func showMailComposer() {
guard MFMailComposeViewController.canSendMail() else {
return
}
let composer = MFMailComposeViewController()
composer.mailComposeDelegate = self
composer.setToRecipients(["email"])
composer.setSubject("")
composer.setMessageBody("", isHTML: false)
composer.present(composer, animated: true)
present(composer, animated: true)
}
}
extension MessagesViewController: MFMailComposeViewControllerDelegate {
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
if let _ = error {
controller.dismiss(animated: true)
}
switch result {
case .cancelled:
print("Cancelled")
case .failed:
print("Failed to send")
case .saved:
print("Saved")
case .sent:
print("Email Sent")
default:
break
}
controller.dismiss(animated: true)
}
}
解决方案
解决此问题的最简单方法是将 的弱引用传递UIViewController
给UICollectionViewCell
. UIViewController
然后在传递的弱引用上调用 present,而不是在UICollectionViewCell
. 就是这样:
在cellForItem
方法:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: Identifier, for: indexPath) as! MessagesViewCell
cell.controller = self
//...
return cell
}
并在MessagesViewCell
:
class MessagesViewCell: UICollectionViewCell, MFMailComposeViewControllerDelegate {
weak var controller: UIViewController?
func showMailComposer() {
guard MFMailComposeViewController.canSendMail() else {
return
}
let composer = MFMailComposeViewController()
composer.mailComposeDelegate = self
composer.setToRecipients(["email"])
composer.setSubject("")
composer.setMessageBody("", isHTML: false)
composer.present(composer, animated: true)
controller?.present(composer, animated: true)
}
推荐阅读
- vba - 如何从 MS Access VBA 中的自定义查询之一读取值?
- keycloak - 切换到 Keycloak 后,主体名称显示不同
- c++ - C ++:如果用户输入数字将其转换为单词并且如果按Enter键程序应该退出,则使用切换案例
- javascript - HTML复选框onclick在IE11中不起作用
- sql - 在 Oracle 中使用字符串值,如数值
- vuejs2 - 如何将 nprogress 与 vuejs 代码拆分一起使用?
- ios - 上传到应用商店的问题
- ios - 快速将字符串(包含 json 字符串)转换为 NSURL
- python - Why the amount of greenlets will impact the elapsed time of the responses
- jquery - 如何在物化css中将图标浮动到右侧?