带委托的Swift扩展(UIViewController)

时间:2018-11-12 19:27:28

标签: ios swift uiviewcontroller swift4 swift-extensions

我需要能够在我的应用程序中的多个视图控制器中发送电子邮件。代码相同,采用三个参数-收件人地址,正文和主题。如果在设备上配置了Mail,请使用视图控制器作为委托初始化MFMailComposeViewController。如果未配置邮件,则引发错误。还将当前视图控制器设置为mailComposeDelegate以侦听回调。如何使用Swift扩展来实现它(将扩展中的委托设置为主要问题)?

2 个答案:

答案 0 :(得分:3)

我认为您应该为此类问题创建服务类,以便可以在其他应用程序中重用。

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

现在您可以使用以下代码从所有三个Controller发送邮件。

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(completion),它以String作为参数来告知它是成功还是失败,但是您可以根据需要编写。此外,您还可以使用委托模式来代替clouser或回调。 >

这类服务类别的主要优势是依赖注入。有关更多详细信息:https://medium.com/@JoyceMatos/dependency-injection-in-swift-87c748a167be

答案 1 :(得分:0)

创建全局函数:

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