用途:在 SwiftUI 与 UIKit 之间做双向互操作。一是把 UIKit 引入 SwiftUI:UIViewRepresentable 包裹自定义 UIView(如文本视图、地图、自定义控件),UIViewControllerRepresentable 包裹 UIViewController(如相机控制器、文档选择器、分享面板)。二是把 SwiftUI 引入 UIKit:UIHostingController 把 SwiftUI 视图嵌入 UIKit 控制器层级,UIHostingConfiguration 把 SwiftUI 视图直接放入 UICollectionView 与 UITableView 单元格(iOS 16+)。
主要能力:Representable 生命周期与 Coordinator。顺序为 makeCoordinator() → makeUIView(context:) → updateUIView(uiView, context:) → dismantleUIView(uiView, coordinator:)。makeCoordinator 只调用一次,创建代理/协调器对象;makeUIView 只调用一次,实例化 UIKit 视图并设置代理;updateUIView 在影响该视图的每次 SwiftUI 状态变化时调用,必须幂等;dismantleUIView 在视图离开层级时清理,停用计时器、注销观察者。
状态同步与反馈循环:当 UIKit 通过协调器通知变化(如 textViewDidChange),协调器经 @Binding 更新 SwiftUI 状态,进而触发 updateUIView。应先做值相等检查再写入 UIKit 视图,例如 if uiView.text != text { uiView.text = text },避免无限更新。
嵌入 SwiftUI 到 UIKit:将 UIHostingController 作为子控制器添加时,依次调用 addChild(hostingController)、view.addSubview(hostingController.view)、设置 Auto Layout 约束、hostingController.didMove(toParent: self)。现代单元格布局可用 UIHostingConfiguration,省去手工管理控制器。
按任务选读:包裹 MKMapView、UITextView 与相机采集控制器,参见 Map、Text、Camera 包裹;PHPickerViewController、MFMailComposeViewController、UIActivityViewController 与搜索控制器,参见 Picker、Mail、Share、Search 包裹;PDFView、QLPreviewController 与 MFMessageComposeViewController,参见 PDF 与 Message 包裹;在 UIKit 表格/集合单元格中嵌入 SwiftUI、导航转场与整体托管迁移,参见 Hosting Migration。
常见错误:在 updateUIView 中重建重量级 UIKit 对象而非配置现有实例;updateUIView 缺少相等检查导致持续渲染反馈循环;添加 UIHostingController 视图时未调用 addChild 与 didMove(toParent:);在 dismantleUIView 中忘记清理代理、KVO 或 NotificationCenter 观察者;自定义 representable 忽略安全区与尺寸计算(sizeThatFits)。
检查清单:makeCoordinator 用于代理、target-action 与数据源;updateUIView 防止冗余赋值;子控制器包含调用成对出现;可用时单元格布局采用 UIHostingConfiguration;已订阅的观察者与 display link 在 dismantleUIView 中失效;Auto Layout 约束配置 translatesAutoresizingMaskIntoConstraints = false。
限制:资料仅给出上述 API 与注意事项,未提供收费、价格、平台兼容细节或使用步骤的更多信息。