首页 > 解决方案 > 尝试从应用程序快速发送电子邮件

问题描述

我正在尝试在 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)
}
}

标签: iosswift

解决方案


解决此问题的最简单方法是将 的弱引用传递UIViewControllerUICollectionViewCell. 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)
}

推荐阅读