MFMailComposeViewController,Swift 4,Xcode 9

4

我在MFMailComposeViewControllerDelegate函数中遇到了问题。

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

警告信息如下:

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

将 'mailComposeController(_:didFinishWith:error:)' 私有化以消除此警告

我需要在点击取消后返回用户到应用程序并关闭 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)
}

}


@the4kman 我已经完成了,这是唯一的自动完成提示。 - Đorđe Nilović
@Krunal,我刚刚更新了我的问题。谢谢。 - Đorđe Nilović
1
@ĐorđeNilović 我在 Xcode 9.3 beta2 和 Swift 4 中测试了你的代码。它可以正常工作,没有任何错误或警告信息。你的代码没有问题。请将 MessageUI 框架从项目中移除并重新添加。 - Krunal
1
@Krunal 我刚刚用一个新项目测试了一下,它也能正常工作。我重置了Xcode在转换为Swift 4时所做的更改,并手动完成了操作。现在它可以正常工作了。说实话,我不知道发生了什么事情,我只能猜测Xcode的转换“损坏”了MessageUI框架。感谢您的时间和建议! - Đorđe Nilović
1
@ĐorđeNilović 回答你的问题,并列出你解决这个问题所遵循的步骤。这对未来的其他人也会有帮助。一天后,你也可以接受自己的答案。 :) - Krunal
显示剩余6条评论
3个回答

12

我无法使用Đorđe的解决方案,但是另一个答案对我有帮助。

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

Error?前加上Swift.前缀可以解决这个问题。


我刚刚编辑了我的答案,并描述了我特定问题的原因。谢谢。 - Đorđe Nilović
花了好几个小时才弄明白这个问题。使用Swift.Error解决了它!谢谢!我猜测,根据你的项目设置和导入的模块,可能会有其他名为Error的类型遮盖了Swift.Error类型。 - ntherning

3

我曾经遇到过同样的问题,即在取消或发送邮件后mailComposeControler委托没有被调用。xCode给了我关于添加private的相同警告。我没有像其他人一样遇到名为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中完成的。


0

编辑:

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

问题在于我有一个名为“Error”的枚举,这就是为什么参数错误:无法识别Swift Error类,因此警告是正确的。

我来编辑答案,看到Boris Y.写了这个修复程序,所以我会接受他的答案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接