![](/img/trans.png)
[英]'UITabBarDelegate' cannot be constructed because it has no accessible initializers
[英]Delegate cannot be constructed because it has no accessible initializers?
所以我有一個 class 有一個 function 來發送短信。 我嘗試使 class 符合委托協議...它最終導致 class 需要一個我認為類型為 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)
}
}
我認為您應該在 這里查看以更深入地了解 swift 中的委托和協議。 你不能實例化一個協議——你需要一個符合該協議的 class 來完成你想要的。
我認為您的 class 應該如下所示:
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
}
}
}
}
可能的另一種解決方案。 您可以創建一個 singleton class 並在根 controller 上呈現 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, animated: true)
}
}
func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
controller.dismiss(animated: true)
}
}
用法:
struct MessageView: View {
var body: some View {
Button("Open Message") {
Functions.shared.sendInviteMessage(number: "12345678")
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.