代码之家  ›  专栏  ›  技术社区  ›  Deepak Sharma

带委托的Swift扩展(UIViewController)

  •  0
  • Deepak Sharma  · 技术社区  · 6 年前

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

    2 回复  |  直到 6 年前
        1
  •  4
  •   Bhavesh.iosDev    6 年前

    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(completion),它以String作为参数来通知它是成功还是失败,但是您可以按照自己的命令来编写要求.in此外,还可以使用委托模式而不是clouser或callback。

    。有关详细信息: https://medium.com/@JoyceMatos/dependency-injection-in-swift-87c748a167be

        2
  •  0
  •   Alex Bailey Bogdan Farca    6 年前

    创建全局函数:

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