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 — локальная установка не требуется.
Все уроки этого курса
- UIViewRepresentable: обёртка для представлений UIKit
- Шаблон Coordinator для взаимодействия с делегатами
- UIViewControllerRepresentable
- UIHostingController: SwiftUI внутри UIKit