Представление MFMailComposeViewController не закрывается во второй раз

У меня есть то, что я считаю уникальной проблемой. У меня не получается закрыть окно электронной почты. Я использую Xcode 8.

Электронное письмо правильно закрывается при первом открытии, но если я открою его снова, оно не исчезнет. Если я нажму «Отмена», это не даст мне возможность «Удалить черновик». Если я нажму «Отправить», электронное письмо будет отправлено, но окно не закроется.

Мой код ниже. mailComposeController вызывается правильно в первый раз, но никогда не вызывается во второй раз. У кого-нибудь есть идеи о том, что мне не хватает?

let mail = MFMailComposeViewController()
func sendEmail(body: String, subject: String) {
    if MFMailComposeViewController.canSendMail() {
        mail.mailComposeDelegate = self

        mail.setSubject(subject)
        mail.setMessageBody("\(body)", isHTML: false)

        if let data = (body as NSString).data(using: String.Encoding.utf8.rawValue){
            //Attach File
            mail.addAttachmentData(data, mimeType: "text/plain", fileName: "data.txt")
        }

        present(mail, animated: true)
    } else {
        // show failure alert
    }
}

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

person Ryan Tensmeyer    schedule 30.03.2017    source источник


Ответы (1)


Вам нужно каждый раз создавать новый MFMailComposeViewController. Перемещение вашей декларации mail внутрь sendEmail работает…

func sendEmail(body: String, subject: String) {
    if MFMailComposeViewController.canSendMail() {

       // Create a new MFMailComposeViewController…
       let mail = MFMailComposeViewController()

        mail.mailComposeDelegate = self

        mail.setSubject(subject)
        mail.setMessageBody("\(body)", isHTML: false)

        if let data = (body as NSString).data(using: String.Encoding.utf8.rawValue){
            //Attach File
            mail.addAttachmentData(data, mimeType: "text/plain", fileName: "data.txt")
        }

        present(mail, animated: true)
    } else {
        // show failure alert
    }
}

А почему…?

person Ashley Mills    schedule 30.03.2017
comment
не связано с исходным вопросом, но вы можете получить данные из строки без необходимости разворачивать ее при работе со строками utf8. mail.addAttachmentData(Data(body.utf8), mimeType: "text/plain", fileName: "data.txt") - person Leo Dabus; 31.03.2017
comment
И спасибо @LeoDabus за предложенное улучшение кода. Это также хорошо работает. - person Ryan Tensmeyer; 31.03.2017