gpt4 book ai didi

ios - 带委托(delegate)的 Swift 扩展 (UIViewController)

转载 作者:行者123 更新时间:2023-11-28 10:06:11 25 4
gpt4 key购买 nike

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

最佳答案

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

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 作为参数来通知它是成功还是失败,但您可以根据您的要求编写。此外,您还可以使用委托(delegate)模式而不是 clouser 或回调。

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

关于ios - 带委托(delegate)的 Swift 扩展 (UIViewController),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53268831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com