【问题标题】:MFMailComposeViewControllerDelegate not being called in other class swift 4MFMailComposeViewController Delegate 没有在其他类中被调用 swift 4
【发布时间】:2018-08-16 16:25:52
【问题描述】:

我有这个代码,它关于 didFinishWith 结果的问题没有被调用并且应用程序崩溃。这是我的代码

注意:在 Objective C 中,这段代码可以正常工作,因为我在我的类中创建了一个强引用,但我在 Swift 中遇到了问题,我不知道如何解决这个问题

import Foundation
import MessageUI

class EmailCreator: NSObject, MFMailComposeViewControllerDelegate {
    // in other class I send this var to show email
    var viewToShow = UIViewController ()

    func sendEmail() {

        let mailComposeViewController = createMailComposeViewController()
        if MFMailComposeViewController.canSendMail(){
            viewToShow.present(mailComposeViewController, animated: true, completion: nil)
        }else{
            print("Can't send email")
        }
    }

    func createMailComposeViewController() -> MFMailComposeViewController {
        let mailComposeViewController = MFMailComposeViewController()
        mailComposeViewController.mailComposeDelegate = self
        mailComposeViewController.setToRecipients(["example@test.test"])
        mailComposeViewController.setSubject("subject")
        mailComposeViewController.setMessageBody("test body", isHTML: false)
        return mailComposeViewController
    }
    //MARK: - MFMail compose method
    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
        controller.dismiss(animated: true, completion: nil)
    }
}

在其他班级我有这个代码来显示电子邮件:

@IBAction func sendEmail(_ sender: UIButton) {

        let email = EmailCreator()
        email.viewToShow = self
        email.sendEmail()
}

【问题讨论】:

  • 什么是崩溃和堆栈跟踪?
  • 线程 1:EXC_BAD_ACCESS(代码=1,地址=0xb6f4ebeb8)
  • 编辑您的问题并在那里添加整个内容。我不能仅仅用它来帮助你。
  • 控制台崩溃时是否有日志?另外,导致崩溃的线路是什么?此外,您正在创建一个 UIViewController 只是为了替换它,为什么不这样做 var viewToShow: UIViewController? ?然后viewToShow?.present(mailComposeViewController, animated: true, completion: nil)
  • 我在 cosole 中没有日志。应用程序显示此错误:线程 1:EXC_BAD_ACCESS (code=1, address=0xb6f4ebeb8)

标签: swift messageui


【解决方案1】:

它崩溃是因为你有 EmailCreator,一个本地变量 MFMailComposeViewController 的代表,如你的 func createMailComposeViewController 所示。当MFMailComposeViewController 调用didFinishWith 方法时,EmailCreator 已经是deinited。 您可以通过将 EmailCreator 实例设为强属性来解决此问题。

YourViewController: UIViewController {
    let email = EmailCreator()

     @IBAction func sendEmail(_ sender: UIButton) {
        email.viewToShow = self
        email.sendEmail()
    }
}

【讨论】:

  • 我还使用此代码来改进 EmailCreator 类中的惰性 var viewToShow = MyVCToShowEmail () 行为 :) 现在可以完美运行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多