0

我正在做一个允许用户发送邮件的屏幕。我为它写了一些代码,它工作正常:

import UIKit
import MessageUI

class ViewController: UIViewController, MFMailComposeViewControllerDelegate {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        let mailComposer = MFMailComposeViewController()
        mailComposer.mailComposeDelegate = self
        let recipients = ["fresher40@gmail.com"]
        mailComposer.setToRecipients(recipients)
        mailComposer.setSubject("Title")
        mailComposer.setMessageBody("Hello", isHTML: false)
        if MFMailComposeViewController.canSendMail() {
            self.present(mailComposer, animated: true, completion: nil)
        }
    }

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

然后我尝试将邮件发送功能移到另一个名为“MailSender”的类中。所以它看起来像:

import UIKit
import MessageUI

class MailSender: NSObject, MFMailComposeViewControllerDelegate {

    private var mailComposer = MFMailComposeViewController()

    init(email: String) {
        super.init()
        mailComposer.mailComposeDelegate = self
        let recipients = [email]
        mailComposer.setToRecipients(recipients)
        mailComposer.setSubject("Title")
        mailComposer.setMessageBody("Hello", isHTML: false)
    }

    func presentOverViewController(viewController: UIViewController) {
        if MFMailComposeViewController.canSendMail() {
            viewController.present(mailComposer, animated: true, completion: nil)
        }
    }

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

我的视图控制器看起来是这样的:

import UIKit
import MessageUI

class ViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        let mailSender = MailSender(email: "someEmail@gmail.com")
        mailSender.presentOverViewController(viewController: self)
    }
}

在这种情况下,屏幕会打开发送邮件视图,但在取消点击按钮后应用程序崩溃。我究竟做错了什么?

4

1 回答 1

1

问题可能mailSender是一个本地人在它有时间做任何事情之前就消失了:

class ViewController: UIViewController {
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        let mailSender = MailSender(email: "someEmail@gmail.com")
        mailSender.presentOverViewController(viewController: self)
    }
}

因此,您最终会得到委托指向一个不存在的对象——当用户取消并且邮件撰写视图控制器尝试与该委托对话时,这是一个简单的崩溃方法。我建议将其设为实例属性:

class ViewController: UIViewController {
    var mailSender : MailSender!
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        self.mailSender = MailSender(email: "someEmail@gmail.com") 
        self.mailSender.presentOverViewController(viewController: self)
    }
}
于 2018-06-15T23:53:04.160 回答