LESSON 20 / 576 分钟

SwiftUI 与 UIKit 双向桥接

新旧框架可以渐进组合,不需要因为一个能力缺口重写整个项目。

用你的前端经验理解

可以把它理解为框架适配器:桥接负责创建、更新、事件回传和生命周期,而不是直接插入 HTML。

为什么需要它

真实项目常需要在 SwiftUI 中使用成熟 UIKit 控件,或在 UIKit 项目逐步加入 SwiftUI。桥接层的职责是转换数据、事件和生命周期,最好保持薄而明确。它不应该成为第二份业务状态仓库,否则两边互相回写很容易出现循环更新。

它是怎样工作的

UIViewRepresentable 创建并更新 UIKit 视图,UIViewControllerRepresentable 用于控制器;Coordinator 可承担 delegate 等回调。make 负责建立对象,update 接收最新输入,不能假定 update 只在用户操作时执行。反向嵌入 SwiftUI 使用 UIHostingController,并遵守 UIKit 控制器嵌入规则。

把关键概念连起来

1

嵌入 UIKit

UIViewRepresentable 包装 UIView;UIViewControllerRepresentable 包装控制器。make 负责创建,update 负责根据新状态更新。

2

事件回传

Coordinator 常用来承接 delegate,把 UIKit 事件转回 SwiftUI 绑定或回调。

3

反向嵌入

UIHostingController 把 SwiftUI 放进 UIKit。注意尺寸、导航、状态归属和控制器包含关系。

把系统文本控件接到 SwiftUI 状态

  1. 创建控件时配置 delegate 与基本样式;把数据更新集中在 update 路径,避免反复创建昂贵对象。
  2. 用户输入经 Coordinator 传回 Binding;父状态再次进入 update 时,先判断值是否真的变化,避免不必要的光标跳动和回写循环。
  3. 移除桥接视图时清理观察者或长期资源,不让回调继续操作已结束的界面。

这里需要你亲自判断

不要在每次 update 中无条件重建控件或写回同一状态,容易形成重复更新。

做一个小练习

说清一个地图包装器的三个方向:初始创建、外部选点更新、用户点击回传。

  1. 画出父状态→控件展示→delegate→父状态的闭环,并标明唯一数据源。
  2. 测试外部重置文本和用户连续输入两条路径。
展开参考思路与验收标准

桥接不是把两套状态同步起来,而是让一个所有者通过适配器驱动另一套控件。程序设置值与用户输入应能区分,副作用要放在合适时机。

在 UIKit 页面中嵌入 SwiftUI 通常使用什么?

继续查阅官方资料
Apple Developer 官方资料

本课聚焦核心认知。具体 API、系统要求与发布政策,以当前官方文档和工程验证为准。

答对理解题后即可标记完成