微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

委托无法构造,因为它没有可访问的初始值设定项?

如何解决委托无法构造,因为它没有可访问的初始值设定项?

所以我有一个具有发送短信功能的类。我尝试使类符合委托协议......它最终导致类需要一个类型别名,我认为它是 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")
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。