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
相关产品推荐
相关产品推荐

