[英]Swift Extension with delegation (UIViewController)
我需要能够在我的应用程序中的多个视图控制器中发送电子邮件。 代码相同,采用三个参数-收件人地址,正文和主题。 如果在设备上配置了Mail,请使用视图控制器作为委托初始化MFMailComposeViewController。 如果未配置邮件,则引发错误。 还将当前视图控制器设置为mailComposeDelegate以侦听回调。 如何使用Swift扩展来实现它(将扩展中的委托设置为主要问题)?
我认为您应该为此类问题创建服务类,以便可以在其他应用程序中重用。
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或callback。
此类服务类的主要优势是依赖注入。有关更多详细信息: https : //medium.com/@JoyceMatos/dependency-injection-in-swift-87c748a167be
创建一个全局函数:
func sendEmail(address: String, body: String, subject: String, viewController: UIViewController) {
//check if email is configured or throw error...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.