You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中如何从UIViewControllerRepresentable的Coordinator访问对应ViewController

解决方法

你无法通过SwiftUI层的CalendarDayView结构体访问UIKit层的DayViewController实例,只需为Coordinator新增一个对DayViewController的弱引用属性,在创建控制器时赋值即可:

实现步骤

  • 在Coordinator类中新增weak修饰的DayViewController可选属性,避免出现循环引用
  • 在makeUIViewController方法中创建完控制器后,将实例赋值给Coordinator的对应属性
  • 业务中如果存在updateUIViewController时替换控制器实例的场景,需要在update方法中同步更新Coordinator持有的引用

完整修改后代码

struct CalendarDayView: UIViewControllerRepresentable {

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

   func makeUIViewController(context: Context) -> DayViewController {
       let dayView = DayViewController()
       dayView.delegate = context.coordinator
       // 给Coordinator赋值控制器引用
       context.coordinator.dayViewController = dayView
       return dayView
   }

   func updateUIViewController(_ dayView: DayViewController, context: Context) {
       dayView.delegate = context.coordinator
       // 同步更新引用,避免控制器替换后调用失效
       context.coordinator.dayViewController = dayView
   }

   typealias UIViewControllerType = DayViewController

   class Coordinator: NSObject, DayViewDelegate {
       
      var parent: CalendarDayView
      // 新增弱引用属性存储控制器实例
      weak var dayViewController: DayViewController?

      init(_ parent: CalendarDayView) {
         self.parent = parent
      }
      
      func dayViewDidSelectEventView(_ eventView: EventView) {
         guard let ckEvent = eventView.descriptor as? EKWrapper else { return }
         let ekEvent = ckEvent.ekEvent
         // 调用控制器方法
         dayViewController?.endEventEditing()
      }

   }

}

内容的提问来源于stack exchange,提问作者Niklas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:33:00