用途:在 SwiftUI 与 UIKit 之间双向桥接,包装 UIKit 视图和控制器、把 SwiftUI 嵌入 UIKit 屏幕,并在不重复生命周期归属的前提下同步状态。
主要能力:
- UIViewRepresentable:用 makeUIView 一次性创建并配置 UIKit 视图,updateUIView 在每次相关状态变化时把 SwiftUI 状态推入视图;可选 dismantleUIView 清理观察者、计时器、订阅;iOS 16+ 可实现 sizeThatFits 自定义尺寸建议。
- UIViewControllerRepresentable:包装系统选择器、文档扫描、邮件撰写等模态控制器,由 Coordinator 捕获委托回调并把结果经 @Binding 或闭包回传。
- Coordinator 模式:SwiftUI 结构体是值类型不能做委托,故用类实例作 Coordinator;委托必须在 make* 中设置而非 update*;在 update* 开头执行 context.coordinator.parent = self 刷新拷贝状态;闭包中弱引用 coordinator 避免循环引用。
- UIHostingController:在 UIKit 控制器中嵌入 SwiftUI 视图,必须依次 addChild、添加并约束 view、didMove(toParent:);iOS 16+ 可用 sizingOptions(.intrinsicContentSize、.preferredContentSize);通过 rootView 或 @Observable 模型更新。
- UIHostingConfiguration(iOS 16+):在 UICollectionViewCell / UITableViewCell 中直接渲染 SwiftUI 内容,无需子宿主控制器。
使用方式:以 Swift 代码声明上述协议实现,按要求划分创建、更新、销毁阶段;尺寸交由 SwiftUI 管理,不改动 uiView 的 frame/bounds/center/transform;更新前加差异守卫防止循环。观察跟踪方面,iOS 26+ 用 updateProperties(),iOS 18 需在 Info.plist 启用 UIObservationTrackingEnabled,iOS 17 用一次性的 withObservationTracking,iOS 15-16 或无 @Observable 时用 Combine objectWillChange、委托或显式回调。严格并发下 Coordinator 标 @MainActor。
适用场景:渐进迁移 UIKit 应用到 SwiftUI、在 SwiftUI 中复用现有 UIKit 组件、在 UIKit 中嵌入 SwiftUI 页面或单元格内容。
限制:部分能力有系统版本要求(sizeThatFits、sizingOptions、UIHostingConfiguration 为 iOS 16+);UIKit 委托协议非 Sendable;withObservationTracking 为一次性,不应轮询;具体价格与平台支持信息暂未提供。