UIHostingController:在 UIKit 中使用 SwiftUI
使用 UIHostingController 将 SwiftUI 视图嵌入 UIKit 应用。
UIHostingController:在 UIKit 中使用 SwiftUI 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
什么是 UIHostingController?
UIHostingController 是一个用于承载 SwiftUI 视图层次结构的 UIKit 视图控制器。
import SwiftUI
let swiftUIView = Text("Hello from SwiftUI")
let hostingVC = UIHostingController(rootView: swiftUIView)嵌入 UIViewController
使用标准的子控制器 API,将托管控制器添加为子视图控制器。
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let child = UIHostingController(rootView: ContentView())
addChild(child)
view.addSubview(child.view)
child.view.frame = view.bounds
child.didMove(toParent: self)
}
}使用托管控制器进行自动布局
使用自动布局固定托管控制器的视图,从而将其集成到 UIKit 布局中。
child.view.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
child.view.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
child.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
child.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
child.view.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])更新根视图
通过设置托管控制器的 rootView,更新其中托管的 SwiftUI 视图。
let hostingVC = UIHostingController(rootView: MyView(count: 0))
// Later:
hostingVC.rootView = MyView(count: 5)以模态方式呈现
像呈现任何 UIKit 模态界面一样呈现托管控制器,从而在 UIKit 呈现方式中使用 SwiftUI 内容。
let vc = UIHostingController(rootView: MySwiftUIView())
present(vc, animated: true)推入导航堆栈
将托管控制器推入 UINavigationController,以便从 UIKit 导航到 SwiftUI 内容。
let vc = UIHostingController(rootView: DetailView())
navigationController?.pushViewController(vc, animated: true)通过 ObservableObject 共享数据
将共享的 ObservableObject 传入 SwiftUI 视图的环境,以实现双向数据流。
let model = SharedModel()
let vc = UIHostingController(rootView: SwiftUIView().environmentObject(model))
// Changes to model in UIKit update SwiftUI and vice versa设置托管控制器的大小
使用 sizeThatFits 计算 SwiftUI 内容的固有大小,以便将其嵌入滚动视图。
let size = hostingVC.sizeThatFits(in: CGSize(width: 320, height: UIView.layoutFittingCompressedSize.height))
hostingVC.view.frame.size = size外观与样式
在托管控制器上设置 overrideUserInterfaceStyle,以独立控制深色或浅色模式。
hostingVC.overrideUserInterfaceStyle = .dark基于场景的应用设置
在以 UIKit 为主的应用中,您可以将根视图控制器替换为托管控制器,从而逐步完成迁移。
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options: UIScene.ConnectionOptions) {
guard let windowScene = scene as? UIWindowScene else { return }
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: ContentView())
self.window = window
window.makeKeyAndVisible()
}使用场景
UIHostingController 非常适合渐进式迁移:保留 UIKit 导航,同时嵌入新的 SwiftUI 功能界面。
// UIKit app gradually migrated:
// - Old screens: UIViewController
// - New screens: UIHostingController(rootView: NewFeatureView())快速检查
要将 SwiftUI 视图嵌入 UIKit 视图控制器层次结构,应使用哪个 UIKit 类?
课程回顾
UIHostingController(rootView:) 可将 SwiftUI 桥接到 UIKit。您可以使用自动布局约束将其添加为子视图控制器,也可以呈现或推入它。通过 rootView 更新内容。通过 ObservableObject 和 environmentObject 共享数据。
常见问题解答
「UIHostingController:在 UIKit 中使用 SwiftUI」课时是免费的吗?
是的 — 「UIHostingController:在 UIKit 中使用 SwiftUI」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「UIHostingController:在 UIKit 中使用 SwiftUI」这节课中我会学到什么?
使用 UIHostingController 将 SwiftUI 视图嵌入 UIKit 应用。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「UIHostingController:在 UIKit 中使用 SwiftUI」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- UIViewRepresentable:封装 UIKit 视图
- 用于代理通信的协调器模式
- UIViewControllerRepresentable
- UIHostingController:在 UIKit 中使用 SwiftUI