在 Swift 中,我会这样做以显示预先编写的消息
let composeVC = MFMessageComposeViewController()
composeVC.messageComposeDelegate = self
composeVC.recipients = ["9999999999"]
composeVC.body = "Text Message"
if MFMessageComposeViewController.canSendText() {
self.present(composeVC, animated: true, completion: nil)
}
在 SwiftUI 中,这会引发错误
Cannot assign value of type 'ContentView' to type 'MFMessageComposeViewControllerDelegate?'
和
Value of type 'ContentView' has no member 'present'
最佳答案
您需要通过 Windows rootview 呈现。使用这些扩展
import SwiftUI
import MessageUI
/// Main View
struct ContentView: View {
private let mailComposeDelegate = MailComposerDelegate()
private let messageComposeDelegate = MessageComposerDelegate()
var body: some View {
VStack {
Spacer()
Button(action: {
self.presentMailCompose()
}) {
Text("email")
}
Spacer()
Button(action: {
self.presentMessageCompose()
}) {
Text("Message")
}
Spacer()
}
}
}
// MARK: The email extension
extension ContentView {
private class MailComposerDelegate: NSObject, MFMailComposeViewControllerDelegate {
func mailComposeController(_ controller: MFMailComposeViewController,
didFinishWith result: MFMailComposeResult,
error: Error?) {
controller.dismiss(animated: true)
}
}
/// Present an mail compose view controller modally in UIKit environment
private func presentMailCompose() {
guard MFMailComposeViewController.canSendMail() else {
return
}
let vc = UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.rootViewController
let composeVC = MFMailComposeViewController()
composeVC.mailComposeDelegate = mailComposeDelegate
vc?.present(composeVC, animated: true)
}
}
// MARK: The message extension
extension ContentView {
private class MessageComposerDelegate: NSObject, MFMessageComposeViewControllerDelegate {
func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
// Customize here
controller.dismiss(animated: true)
}
}
/// Present an message compose view controller modally in UIKit environment
private func presentMessageCompose() {
guard MFMessageComposeViewController.canSendText() else {
return
}
let vc = UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.rootViewController
let composeVC = MFMessageComposeViewController()
composeVC.messageComposeDelegate = messageComposeDelegate
vc?.present(composeVC, animated: true)
}
}
inspiration and credits
关于ios - 使用 SwiftUI 以编程方式发送 SMS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60014299/