Search code examples
swiftswiftuiuiviewrepresentable

How can i access ViewController Class from Coordinator?


I am using a UIViewControllerRepresentable Class in my SwiftUI like this:

struct CalendarDayView: UIViewControllerRepresentable {

   func makeCoordinator() -> Coordinator {
       return Coordinator(self)
   }

   func makeUIViewController(context: Context) -> DayViewController {
       let dayView = DayViewController()
       dayView.delegate = context.coordinator
       return dayView
   }

   func updateUIViewController(_ dayView: DayViewController, context: Context) {
       dayView.delegate = context.coordinator
   }

   typealias UIViewControllerType = DayViewController

   class Coordinator: NSObject, DayViewDelegate {
       
      var parent: CalendarDayView

      init(_ parent: CalendarDayView) {
         self.parent = parent
      }
      
      func dayViewDidSelectEventView(_ eventView: EventView) {
         guard let ckEvent = eventView.descriptor as? EKWrapper else { return }
         let ekEvent = ckEvent.ekEvent
         endEventEditing() // Cannot find 'endEventEditing' in scope
      }

  
   }

}

In the dayViewDidSelectEventView() function i need access to the endEventEditing() function, coming from the DayViewController Class. I already try to pass the parent to the Coordinator, but that doesn't helpful. I can't access the endEventEditing() func over the parent variable like this:

parent.endEventEditing() // Value of type 'CalendarDayView' has no member 'endEventEditing'

So is there a way to access the DayViewController Class, generated by the makeUIViewController func inside Coordinator?

Can i use/pass the dayView variable

let dayView = DayViewController()

to my Coordinator so i can use functions coming from this Controller?


Solution

  • You can inject it in coordinator's property (having it weak to avoid cross-references).

    Here is a demo:

    struct CalendarDayView: UIViewControllerRepresentable {
    
       func makeCoordinator() -> Coordinator {
           return Coordinator(self)
       }
    
       func makeUIViewController(context: Context) -> DayViewController {
           let dayView = DayViewController()
           dayView.delegate = context.coordinator
           context.coordinator.viewController = dayView   // << inject !!
           return dayView
       }
    
       func updateUIViewController(_ dayView: DayViewController, context: Context) {
           dayView.delegate = context.coordinator
       }
    
       typealias UIViewControllerType = DayViewController
    
       class Coordinator: NSObject, DayViewDelegate {
          weak var viewController: DayViewController?     // << declare here !!
          var parent: CalendarDayView
    
          init(_ parent: CalendarDayView) {
             self.parent = parent
          }
    
          func dayViewDidSelectEventView(_ eventView: EventView) {
             guard let ckEvent = eventView.descriptor as? EKWrapper else { return }
             let ekEvent = ckEvent.ekEvent
             viewController?.endEventEditing()   // << call !!
          }
    
    
       }
    }