SwiftUI: Send email

前端 未结 6 1503
小蘑菇
小蘑菇 2020-12-08 02:06

In a normal UIViewController in Swift, I use this code to send a mail.

let mailComposeViewController = configuredMailComposeViewController()

ma         


        
6条回答
  •  醉酒成梦
    2020-12-08 02:46

    @Matteo's answer is good but it needs to use the presentation environment variable. I have updated it here and it addresses all of the concerns in the comments.

    import SwiftUI
    import UIKit
    import MessageUI
    
    struct MailView: UIViewControllerRepresentable {
    
        @Environment(\.presentationMode) var presentation
        @Binding var result: Result?
    
        class Coordinator: NSObject, MFMailComposeViewControllerDelegate {
    
            @Binding var presentation: PresentationMode
            @Binding var result: Result?
    
            init(presentation: Binding,
                 result: Binding?>) {
                _presentation = presentation
                _result = result
            }
    
            func mailComposeController(_ controller: MFMailComposeViewController,
                                       didFinishWith result: MFMailComposeResult,
                                       error: Error?) {
                defer {
                    $presentation.wrappedValue.dismiss()
                }
                guard error == nil else {
                    self.result = .failure(error!)
                    return
                }
                self.result = .success(result)
            }
        }
    
        func makeCoordinator() -> Coordinator {
            return Coordinator(presentation: presentation,
                               result: $result)
        }
    
        func makeUIViewController(context: UIViewControllerRepresentableContext) -> MFMailComposeViewController {
            let vc = MFMailComposeViewController()
            vc.mailComposeDelegate = context.coordinator
            return vc
        }
    
        func updateUIViewController(_ uiViewController: MFMailComposeViewController,
                                    context: UIViewControllerRepresentableContext) {
    
        }
    }
    

    Usage:

    import SwiftUI
    import MessageUI
    
    struct ContentView: View {
    
       @State var result: Result? = nil
       @State var isShowingMailView = false
    
        var body: some View {
            Button(action: {
                self.isShowingMailView.toggle()
            }) {
                Text("Tap Me")
            }
            .disabled(!MFMailComposeViewController.canSendMail())
            .sheet(isPresented: $isShowingMailView) {
                MailView(result: self.$result)
            }
        }
    }
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
    

提交回复
热议问题