LESSON 20 / 576 分钟
SwiftUI 与 UIKit 双向桥接
新旧框架可以渐进组合,不需要因为一个能力缺口重写整个项目。
用你的前端经验理解
可以把它理解为框架适配器:桥接负责创建、更新、事件回传和生命周期,而不是直接插入 HTML。
01 / 理解问题
为什么需要它
真实项目常需要在 SwiftUI 中使用成熟 UIKit 控件,或在 UIKit 项目逐步加入 SwiftUI。桥接层的职责是转换数据、事件和生命周期,最好保持薄而明确。它不应该成为第二份业务状态仓库,否则两边互相回写很容易出现循环更新。
它是怎样工作的
UIViewRepresentable 创建并更新 UIKit 视图,UIViewControllerRepresentable 用于控制器;Coordinator 可承担 delegate 等回调。make 负责建立对象,update 接收最新输入,不能假定 update 只在用户操作时执行。反向嵌入 SwiftUI 使用 UIHostingController,并遵守 UIKit 控制器嵌入规则。
02 / 掌握要点
把关键概念连起来
1
嵌入 UIKit
UIViewRepresentable 包装 UIView;UIViewControllerRepresentable 包装控制器。make 负责创建,update 负责根据新状态更新。
2
事件回传
Coordinator 常用来承接 delegate,把 UIKit 事件转回 SwiftUI 绑定或回调。
3
反向嵌入
UIHostingController 把 SwiftUI 放进 UIKit。注意尺寸、导航、状态归属和控制器包含关系。
03 / 案例推演
把系统文本控件接到 SwiftUI 状态
- 创建控件时配置 delegate 与基本样式;把数据更新集中在 update 路径,避免反复创建昂贵对象。
- 用户输入经 Coordinator 传回 Binding;父状态再次进入 update 时,先判断值是否真的变化,避免不必要的光标跳动和回写循环。
- 移除桥接视图时清理观察者或长期资源,不让回调继续操作已结束的界面。
这里需要你亲自判断
不要在每次 update 中无条件重建控件或写回同一状态,容易形成重复更新。
04 / 动手验证
做一个小练习
说清一个地图包装器的三个方向:初始创建、外部选点更新、用户点击回传。
- 画出父状态→控件展示→delegate→父状态的闭环,并标明唯一数据源。
- 测试外部重置文本和用户连续输入两条路径。
展开参考思路与验收标准
桥接不是把两套状态同步起来,而是让一个所有者通过适配器驱动另一套控件。程序设置值与用户输入应能区分,副作用要放在合适时机。
05 / 检查理解
在 UIKit 页面中嵌入 SwiftUI 通常使用什么?
答对理解题后即可标记完成