How to use EKEventEditViewController in SwiftUI

My finished solution to bridging this view controller for creating new events and editing existing ones to SwiftUI.

I have made another notable progress porting my EKEventKit Example app to SwiftUI with bridging the EKEventEditViewController. This ready-made controller will let you create new event and save it as well and also edit existing events that you can pass in.

This time I could draw inspiration from using EKCalendarChooser in SwiftUI from my previous post.

Below is fully working code to use EKEventEditViewController in your SwiftUI.

import SwiftUI
import EventKitUI

struct EventEditView: UIViewControllerRepresentable {
    func makeCoordinator() -> Coordinator {
        return Coordinator(self)
    }

    @Environment(\.presentationMode) var presentationMode

    let eventStore: EKEventStore
    let event: EKEvent?

    func makeUIViewController(context: UIViewControllerRepresentableContext<EventEditView>) -> EKEventEditViewController {

        let eventEditViewController = EKEventEditViewController()
        eventEditViewController.eventStore = eventStore

        if let event = event {
            eventEditViewController.event = event // when set to nil the controller would not display anything
        }
        eventEditViewController.editViewDelegate = context.coordinator

        return eventEditViewController
    }

    func updateUIViewController(_ uiViewController: EKEventEditViewController, context: UIViewControllerRepresentableContext<EventEditView>) {

    }

    class Coordinator: NSObject, EKEventEditViewDelegate {
        let parent: EventEditView

        init(_ parent: EventEditView) {
            self.parent = parent
        }

        func eventEditViewController(_ controller: EKEventEditViewController, didCompleteWith action: EKEventEditViewAction) {
            parent.presentationMode.wrappedValue.dismiss()

            if action != .canceled {
                NotificationCenter.default.post(name: .eventsDidChange, object: nil) // custom notification to reload UI when events changed
            }
        }
    }
}

This can then be used with sheet modifier:

EventEditView(eventStore: self.eventsRepository.eventStore, event: self.selectedEvent)

You can pass nil as event to create new one using the EKEventEditViewController.

Other EventKit posts are available here.

Uses: Xcode 11 & Swift 5