0Pricing
Swift Academy · Урок

UIHostingController: SwiftUI внутри UIKit

Встраивайте представления SwiftUI в приложения UIKit с помощью UIHostingController.

«UIHostingController: SwiftUI внутри UIKit» — бесплатный урок Swift Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Что такое UIHostingController?

UIHostingController — это контроллер представления UIKit, который размещает иерархию представлений SwiftUI.

import SwiftUI
let swiftUIView = Text("Hello from SwiftUI")
let hostingVC = UIHostingController(rootView: swiftUIView)

Встраивание в UIViewController

Добавьте хостинг-контроллер как дочерний контроллер представления с помощью стандартного API для дочерних контроллеров VC.

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)
  }
}

Auto Layout с хостинг-контроллером

Зафиксируйте представление хостинг-контроллера с помощью Auto Layout, чтобы встроить его в макет 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)
])

Обновление корневого представления

Обновите размещённое представление SwiftUI, задав rootView хостинг-контроллера.

let hostingVC = UIHostingController(rootView: MyView(count: 0))
// Later:
hostingVC.rootView = MyView(count: 5)

Модальная презентация

Представьте хостинг-контроллер так же, как любой модальный контроллер UIKit, добавив содержимое SwiftUI в презентацию UIKit.

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())

Быстрая проверка

Какой класс UIKit используется для встраивания представления SwiftUI в иерархию контроллеров представления UIKit?

Итоги урока

UIHostingController(rootView:) связывает SwiftUI с UIKit. Добавьте его как дочерний контроллер представления с ограничениями Auto Layout либо представьте или добавьте его в стек навигации. Обновляйте его через rootView. Передавайте данные через ObservableObject и environmentObject.

Часто задаваемые вопросы

Урок «UIHostingController: SwiftUI внутри UIKit» бесплатный?

Да — полный текст урока «UIHostingController: SwiftUI внутри UIKit» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «UIHostingController: SwiftUI внутри UIKit»?

Встраивайте представления SwiftUI в приложения UIKit с помощью UIHostingController. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «UIHostingController: SwiftUI внутри UIKit»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. UIViewRepresentable: обёртка для представлений UIKit
  2. Шаблон Coordinator для взаимодействия с делегатами
  3. UIViewControllerRepresentable
  4. UIHostingController: SwiftUI внутри UIKit
← Назад к Swift Academy