ios - 使用 SwiftUI 以编程方式发送 SMS

标签 ios swift swiftui

在 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)
    }
}

enter image description here

inspiration and credits

关于ios - 使用 SwiftUI 以编程方式发送 SMS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60014299/

相关文章:

iOS clang : error Xcode 7. 3.1

ios - 如何自定义 UICollectionView Cell 项目行为?

ios - -[UIViewController tableView :numberOfRowsInSection:]: unrecognized selector sent to instance 0x7ff437517770

swift - 如何捕获通过 SwiftUI 中的函数更改的值更改?

ios - AttributeGraph : cycle detected through attribute using @State in playgrounds

ios - 从容器 View 内的 TableView 单元格进行 Segue 不起作用

ios - 如何将 [NSManagedObject] 转换为 nsmutablearray (Swift)

ios - 哪个 iOS 引用可以在 iPad mini 上进行实时视频播放?

swift - 在 Swift 中循环播放 A 到 B 的动画

swift - 如何在 SwiftUI for MacOS 中创建多行文本字段?