0Pricing
Swift Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. UIViewRepresentable:封装 UIKit 视图
  2. 用于代理通信的协调器模式
  3. UIViewControllerRepresentable
  4. UIHostingController:在 UIKit 中使用 SwiftUI
← 返回 Swift Academy