Быстрое расширение с делегированием (UIViewController) - PullRequest
0 голосов
/ 12 ноября 2018

Мне нужна возможность отправлять электронную почту через несколько контроллеров представления в моем приложении. Код такой же, принять три параметра - адрес получателя, тело и тему. Если Почта настроена на устройстве, инициализируйте MFMailComposeViewController с контроллером представления в качестве делегата. Если почта не настроена, выведите ошибку. Также установите текущий контроллер представления как mailComposeDelegate для прослушивания обратных вызовов. Как можно использовать расширение Swift для его достижения (основной проблемой является установка делегата в расширении)?

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Я думаю, вам следует создать класс обслуживания для этого типа проблемы, чтобы его можно было повторно использовать в другом приложении.

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

0 голосов
/ 13 ноября 2018

Создать глобальную функцию:

func sendEmail(address: String, body: String, subject: String, viewController: UIViewController) {
    //check if email is configured or throw error...
}
...