Я думаю, вам следует создать класс обслуживания для этого типа проблемы, чтобы его можно было повторно использовать в другом приложении.
class MailSender : NSObject , MFMailComposeViewControllerDelegate {
var currentController : UIViewController!
var recipient : [String]!
var message : String!
var compltion : ((String)->())?
init(from Controller:UIViewController,recipint:[String],message:String) {
currentController = Controller
self.recipient = recipint
self.message = message
}
func sendMail() {
if MFMailComposeViewController.canSendMail() {
let mail = MFMailComposeViewController()
mail.mailComposeDelegate = self
mail.setToRecipients(recipient)
mail.setMessageBody(message, isHTML: true)
currentController.present(mail, animated: true)
} else {
if compltion != nil {
compltion!("error")
}
}
}
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
if compltion != nil {
compltion!("error")
}
controller.dismiss(animated: true)
}
}
теперь вы можете отправлять почту со всех трех контроллеров, используя следующий код.
let mailsender = MailSender(from: self,recipint:["example@via.com"],message:"your message")
mailsender.sendMail()
mailsender.compltion = { [weak self] result in
print(result)
//other stuff
}
помните, что я использовал простой Clouser (завершение), который принимает String в качестве аргумента, чтобы сообщить, успешен он или нет, но вы можете написать в соответствии со своим требованием. Кроме того, вы также можете использовать шаблон делегата вместо clouser или callback.
Основным преимуществом данного класса услуг является внедрение зависимости . Для более подробной информации: https://medium.com/@JoyceMatos/dependency-injection-in-swift-87c748a167be