Description
When presenting MFMessageComposeViewController from SwiftUI using UIViewControllerRepresentable, the close button disappears after sending a message on iOS 26. As a result, the message compose screen cannot be dismissed, leaving the user stuck on the Messages UI.
struct MessageComposeView: UIViewControllerRepresentable { typealias Completion = (_ messageSent: Bool) -> Void
static var canSendText: Bool { MFMessageComposeViewController.canSendText() }
let recipients: [String]?
let body: String?
let completion: Completion?
func makeUIViewController(context: Context) -> UIViewController {
guard Self.canSendText else {
let errorView = MessagesUnavailableView()
return UIHostingController(rootView: errorView)
}
let controller = MFMessageComposeViewController()
controller.messageComposeDelegate = context.coordinator
controller.recipients = recipients
controller.body = body
return controller
}
func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}
func makeCoordinator() -> Coordinator {
Coordinator(completion: self.completion)
}
class Coordinator: NSObject, MFMessageComposeViewControllerDelegate {
private let completion: Completion?
public init(completion: Completion?) {
self.completion = completion
}
public func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
if result == .cancelled {
controller.dismiss(animated: true, completion: nil)
}
completion?(result == .sent)
}
}
}
Before sending message:
After sending message: