swift - 使用 MFMailComposeViewController 时应用程序崩溃

标签 swift nsobject nsobjectprotocol

我正在做一个允许用户发送邮件的屏幕。我为它写了一些代码,它运行良好:

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)
    }
}

我的 View Controller 看起来是这样的:

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)
    }
}

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

最佳答案

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

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

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

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)
    }
}

关于swift - 使用 MFMailComposeViewController 时应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50883855/

相关文章:

ios - 如何根据单元格文本获取UICollectionViewCell的indexPath?

ios - 如何使用属性观察器更新在其他 Controller 中具有相同属性的 swift NSObject 模型?

ios - 如何使用 CoreData 存储自定义类

ios - Swift 类/结构隐式符合 NSObjectProtocol?

ios - 线程 1 : Exc Bad Instruction in UITableViewCell

macos - 如何禁用 NSTextView 中图像的标记选项?

swift - 同时更新多个 UserDefaults 文件

swift - 需要澄清 Swift 中的 AnyObject

swift - CCC 类型不符合协议(protocol) 'NSObjectProtocol'