Ios 使用SwiftUI发送电子邮件
我正在尝试在我的迷你应用程序中实现发送电子邮件功能 下面是我正在使用的代码(取自): <代码>导入基础 导入快捷键 导入消息用户界面 func sendmail(){ 如果MFMailComposeViewController.canSendMail(){ 让mail=MFMailComposeViewController() mail.mailComposeDelegate=self mail.setToRecipients([”you@yoursite.com"]) setMessageBody(“你太棒了!”,isHTML:true) 当前(邮件,动画:真) }否则{ //显示故障警报 } } func-mailcomosecontroller(u控制器:mfmailcomoseviewcontroller,didFinishWith结果:MFMailComposeResult,错误:error?){ 控制器。解除(动画:真) } 运行代码时,我会出现以下两个错误:Ios 使用SwiftUI发送电子邮件,ios,swift,email,swiftui,messageui,Ios,Swift,Email,Swiftui,Messageui,我正在尝试在我的迷你应用程序中实现发送电子邮件功能 下面是我正在使用的代码(取自): 导入基础 导入快捷键 导入消息用户界面 func sendmail(){ 如果MFMailComposeViewController.canSendMail(){ 让mail=MFMailComposeViewController() mail.mailComposeDelegate=self mail.setToRecipients([”you@yoursite.com"]) setMessageBody(“
在范围内找不到self
在范围中找不到存在的文件
如何修复它?您可以使用
UIViewControllerRepresentable
MailComposeViewController
struct MailComposeViewController: UIViewControllerRepresentable {
var toRecipients: [String]
var mailBody: String
var didFinish: ()->()
func makeCoordinator() -> Coordinator {
return Coordinator(self)
}
func makeUIViewController(context: UIViewControllerRepresentableContext<MailComposeViewController>) -> MFMailComposeViewController {
let mail = MFMailComposeViewController()
mail.mailComposeDelegate = context.coordinator
mail.setToRecipients(self.toRecipients)
mail.setMessageBody(self.mailBody, isHTML: true)
return mail
}
final class Coordinator: NSObject, MFMailComposeViewControllerDelegate {
var parent: MailComposeViewController
init(_ mailController: MailComposeViewController) {
self.parent = mailController
}
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
parent.didFinish()
controller.dismiss(animated: true)
}
}
func updateUIViewController(_ uiViewController: MFMailComposeViewController, context: UIViewControllerRepresentableContext<MailComposeViewController>) {
}
}
另一种可能的解决办法。您可以创建一个单例类并在根控制器上显示
MFMailComposeViewController
。您可以根据需要修改功能。像这样
class MailComposeViewController: UIViewController, MFMailComposeViewControllerDelegate {
static let shared = MailComposeViewController()
func sendEmail() {
if MFMailComposeViewController.canSendMail() {
let mail = MFMailComposeViewController()
mail.mailComposeDelegate = self
mail.setToRecipients(["you@yoursite.com"])
mail.setMessageBody("<p>You're so awesome!</p>", isHTML: true)
UIApplication.shared.windows.first?.rootViewController?.present(mail, animated: true)
} else {
// show failure alert
}
}
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
controller.dismiss(animated: true)
}
}
您在哪里定义了这些方法?看起来
sendmail
不是一个既不是类也不是结构的方法,这是第一个错误的原因之一message@Asesh是的,你说得对。我从未将它用作类或结构的方法,这并不是真正的SwiftUI解决方案。您应该将MFMailComposeViewController
包装在UIViewControllerRepresentable
中,而不是创建单例UIViewController
。谢谢!Xcode不再显示这些错误,尽管点击按钮发送时不会发生任何事情…@DávidPásztor请您进一步解释一下这个想法好吗?:)@PhilippLazarev你能检查一下我的最新答案吗?因为模拟器中没有邮件应用程序。
struct MailView: View {
@State private var showingMail = false
var body: some View {
VStack {
Button("Open Mail") {
self.showingMail.toggle()
}
}
.sheet(isPresented: $showingMail) {
MailComposeViewController(toRecipients: ["test@gmail.com"], mailBody: "Here is mail body") {
// Did finish action
}
}
}
}
class MailComposeViewController: UIViewController, MFMailComposeViewControllerDelegate {
static let shared = MailComposeViewController()
func sendEmail() {
if MFMailComposeViewController.canSendMail() {
let mail = MFMailComposeViewController()
mail.mailComposeDelegate = self
mail.setToRecipients(["you@yoursite.com"])
mail.setMessageBody("<p>You're so awesome!</p>", isHTML: true)
UIApplication.shared.windows.first?.rootViewController?.present(mail, animated: true)
} else {
// show failure alert
}
}
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
controller.dismiss(animated: true)
}
}
Button(action: {
MailComposeViewController.shared.sendEmail()
}, label: {
Text("Send")
})