问题描述
所以我有一个具有发送短信功能的类。我尝试使类符合委托协议......它最终导致类需要一个类型别名,我认为它是 MFMessageViewController 类型,但没有用
class functions: NSObject,ObservableObject,MFMessageComposeViewControllerDelegate {
func sendInviteMessage(number: String) {
if MFMessageComposeViewController.canSendText() {
let message = MFMessageComposeViewController()
message.messageComposeDelegate = self
message.recipients = [number]
message.body = "Hi,I'd like to invite you to join my app google.com"
message.present(message,animated: true)
}
}
func mailComposeController(_ controller: MFMailComposeViewController,didFinishWith result: MFMailComposeResult,error: Error?) {
controller.dismiss(animated: true)
}
}
解决方法
我认为您应该查看 here 以快速深入了解委托和协议。您无法实例化协议 - 您需要一个符合该协议的类来完成您想要的。
我认为你的类应该是这样的:
class functions: NSObject,ObservableObject,MFMessageComposeViewControllerDelegate {
func sendInviteMessage() {
if MFMessageComposeViewController.canSendText() {
let message = MFMessageComposeViewController()
message.messageComposeDelegate = self
message.recipients = ["##########"]
message.body = "Hi,I'd like to invite you to join my app google.com"
// here we have a problem - You will need a ViewController or something that presents the MessageComposeViewController "message" --> It cannot present itself
//message.present(message,animated: true)
}
}
func messageComposeViewController(_ controller: MFMessageComposeViewController,didFinishWith result: MessageComposeResult) {
controller.dismiss(animated: true)
}
}
这在很大程度上取决于您的需求,演示文稿的解决方案是什么样的。 (IMO 此代码应放在 UIViewController
中)
如果有帮助,请告诉我!
,如果您的项目使用 SwiftUI,那么您可以使用 UIViewControllerRepresentable
struct MessageComposeViewController: UIViewControllerRepresentable {
var toRecipients: [String]
var messageBody: String
var didFinish: ()->()
func makeCoordinator() -> Coordinator {
return Coordinator(self)
}
func makeUIViewController(context: UIViewControllerRepresentableContext<MessageComposeViewController>) -> MFMessageComposeViewController {
let message = MFMessageComposeViewController()
message.messageComposeDelegate = context.coordinator
message.recipients = self.toRecipients
message.body = self.messageBody
return message
}
final class Coordinator: NSObject,MFMessageComposeViewControllerDelegate {
var parent: MessageComposeViewController
init(_ controller: MessageComposeViewController) {
self.parent = controller
}
func messageComposeViewController(_ controller: MFMessageComposeViewController,didFinishWith result: MessageComposeResult) {
parent.didFinish()
controller.dismiss(animated: true)
}
}
func updateUIViewController(_ uiViewController: MFMessageComposeViewController,context: UIViewControllerRepresentableContext<MessageComposeViewController>) {
}
}
用法:
struct MessageView: View {
@State private var showingMessage = false
var body: some View {
VStack {
Button("Open Message") {
self.showingMessage.toggle()
}
}
.sheet(isPresented: $showingMessage) {
MessageComposeViewController(toRecipients: ["1234567890"],messageBody: "Hi,I'd like to invite you to join my app google.com") {
// Did finish action
}
}
}
}
可能的另一种解决方案。您可以创建一个单例类并在根控制器上显示 MFMessageComposeViewController。 像这样
class Functions: NSObject,MFMessageComposeViewControllerDelegate {
static let shared = Functions()
func sendInviteMessage(number: String) {
if MFMessageComposeViewController.canSendText() {
let message = MFMessageComposeViewController()
message.messageComposeDelegate = self
message.recipients = [number]
message.body = "Hi,I'd like to invite you to join my app google.com"
UIApplication.shared.windows.first?.rootViewController?.present(message,didFinishWith result: MessageComposeResult) {
controller.dismiss(animated: true)
}
}
用法:
struct MessageView: View {
var body: some View {
Button("Open Message") {
Functions.shared.sendInviteMessage(number: "12345678")
}
}
}