Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用SwiftUI发送电子邮件_Ios_Swift_Email_Swiftui_Messageui - Fatal编程技术网

Ios 使用SwiftUI发送电子邮件

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(“

我正在尝试在我的迷你应用程序中实现发送电子邮件功能

下面是我正在使用的代码(取自):

<代码>导入基础 导入快捷键 导入消息用户界面 func sendmail(){ 如果MFMailComposeViewController.canSendMail(){ 让mail=MFMailComposeViewController() mail.mailComposeDelegate=self mail.setToRecipients([”you@yoursite.com"]) setMessageBody(“你太棒了!

”,isHTML:true) 当前(邮件,动画:真) }否则{ //显示故障警报 } } func-mailcomosecontroller(u控制器:mfmailcomoseviewcontroller,didFinishWith结果:MFMailComposeResult,错误:error?){ 控制器。解除(动画:真) } 运行代码时,我会出现以下两个错误:

在范围内找不到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")
})