【问题标题】:How can i access ViewController Class from Coordinator?如何从 Coordinator 访问 ViewController 类?
【发布时间】:2021-09-12 10:04:43
【问题描述】:

我在我的 SwiftUI 中使用 UIViewControllerRepresentable 类,如下所示:

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
      }

  
   }

}

dayViewDidSelectEventView() 函数中,我需要访问来自 DayViewController 类的 endEventEditing() 函数。我已经尝试将父母传递给协调员,但这没有帮助。我无法像这样通过父变量访问 endEventEditing() 函数:

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

那么有没有办法访问由 Coordinator 内部的 makeUIViewController func 生成的 DayViewController 类?

我可以使用/传递dayView 变量

let dayView = DayViewController()

给我的协调员,这样我就可以使用来自这个控制器的功能?

【问题讨论】:

    标签: swift swiftui uiviewrepresentable


    【解决方案1】:

    您可以将它注入到协调器的属性中(使用weak 以避免交叉引用)。

    这是一个演示:

    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 !!
          }
    
    
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      相关资源
      最近更新 更多