MFMailComposeViewController Delegate 没有在其他类中被调用 swift 4

Posted

技术标签:

【中文标题】MFMailComposeViewController Delegate 没有在其他类中被调用 swift 4【英文标题】:MFMailComposeViewControllerDelegate not being called in other class 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) 【参考方案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 () 行为 :) 现在可以完美运行

以上是关于MFMailComposeViewController Delegate 没有在其他类中被调用 swift 4的主要内容,如果未能解决你的问题,请参考以下文章