MFMailComposeViewController,Swift 4,Xcode 9

时间:2018-02-09 09:57:34

标签: ios swift xcode mfmailcomposeviewcontroller

我遇到MFMailComposeViewControllerDelegate函数问题。

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
    controller.dismiss(animated: true, completion: nil)
}

警告说

  

实例方法' mailComposeController(:didFinishWith:error :)'几乎匹配可选要求' mailComposeController(:didFinishWith:error :)'协议' MFMailComposeViewControllerDelegate'

     

制作' mailComposeController(_:didFinishWith:错误:)'私下沉默这个警告

我需要将用户返回到应用程序并在单击取消后关闭MFMailComposeViewController并且不会触发此功能。

是的,我添加了代理composeVC.mailComposeDelegate = self

如果有人遇到类似的问题,我会很感激帮助。感谢

修改

只有当我将语言设置为Swift 4时才会发生这种情况。我只是回过头几次提交,并且它与Swift 3.2完美配合

基本上,这是代码:

class TechSupportVC: UIViewController, MFMailComposeViewControllerDelegate {
    let composeVC = MFMailComposeViewController()

override func viewDidLoad() {
    super.viewDidLoad()

    composeVC.mailComposeDelegate = self
    composeVC.setToRecipients(["desiredEmail@gmail.com"])
    composeVC.setSubject("My message")
}

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
    controller.dismiss(animated: true, completion: nil)
}

@IBAction func sendPressed(_ sender: Any) {
    guard MFMailComposeViewController.canSendMail() else {
        showMailServiceErrorAlert()
        return
    }

    composeVC.setMessageBody("Test credentials: \(firstAndLastNameTextField.text!)\nPhone: \(numberTextField.text!)\n\n\(messageTextView.text!)", isHTML: false)

    self.present(composeVC, animated: true, completion: nil)
}

}

3 个答案:

答案 0 :(得分:7)

我无法应用Đorđe's solution,other answer帮助了我。

func mailComposeController(_ controller: MFMailComposeViewController,
                           didFinishWith result: MFMailComposeResult,
                           error: Swift.Error?) {
    controller.dismiss(animated: true, completion: nil)
}

Swift.添加Error?前缀可以解决问题。

答案 1 :(得分:1)

我遇到了同样的问题,即取消或发送邮件后没有调用mailComposeControler委托。 xCode也向我发出了有关添加私有的相同警告。我没有一个像其他人一样的名为Error的枚举问题。

我要解决的唯一方法是将函数明确定义为public

public func mailComposeController(_ controller: MFMailComposeViewController,
                                  didFinishWith result: MFMailComposeResult, error: Error?) {
    // Check the result or perform other tasks.

    // Dismiss the mail compose view controller.
    self.dismiss(animated: true, completion: nil)
}

这样做之后,效果很好。

这是在Swift 4.0中的xCode 10.1。

答案 2 :(得分:0)

修改

在项目中添加其他类后,我又遇到了同样的问题,并意识到转换不是问题。

问题是我有一个名为Error的枚举,这就是为什么参数错误:没有识别Swift Error类,所以警告是正确的。

我来编辑答案,我看到Boris Y.为此写了解决方案,所以我会接受his answer