Как встроить SwiftUI-вью в UIKit-контроллер с помощью UIHostingController?

Как встроить SwiftUI-вью в UIKit с помощью UIHostingController? Для интеграции SwiftUI-вью в UIKit используется UIHostingController UIHostingController — это UIViewController, который служит оболочкой для SwiftUI-вью…

Короткий ответ

Что ответить на собеседовании

Как встроить SwiftUI-вью в UIKit с помощью UIHostingController? Для интеграции SwiftUI-вью в UIKit используется UIHostingController UIHostingController — это UIViewController, который служит оболочкой для SwiftUI-вью Создаём UIHostingController, передав ему необходимое SwiftUI-вью Подключаем UIHostingController к иерархии как дочерний UIViewController с помощью addChild Вставляем hostingController.view в UIKit-иерархию через view.addSubview Задаём constraints, чтобы вью корректно отображалось Завершаем подключение вызовом hostingController.didMove(toParent:)

Подробный разбор

Ответ с пояснениями

Как встроить SwiftUI-вью в UIKit с помощью UIHostingController?

  • Для интеграции SwiftUI-вью в UIKit используется UIHostingController
  • UIHostingController — это UIViewController, который служит оболочкой для SwiftUI-вью
  • Создаём UIHostingController, передав ему необходимое SwiftUI-вью
  • Подключаем UIHostingController к иерархии как дочерний UIViewController с помощью addChild
  • Вставляем hostingController.view в UIKit-иерархию через view.addSubview
  • Задаём constraints, чтобы вью корректно отображалось
  • Завершаем подключение вызовом hostingController.didMove(toParent:)

Пример кода:

let swiftUIView = MySwiftUIView()
let hostingController = UIHostingController(rootView: swiftUIView)
addChild(hostingController)
view.addSubview(hostingController.view)
hostingController.view.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
hostingController.view.topAnchor.constraint(equalTo: view.topAnchor),
hostingController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
hostingController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
hostingController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
])
hostingController.didMove(toParent: self)

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

Подробный ответ

Основной ответ

Для добавления SwiftUI-вью в UIKit-контроллер применяется класс UIHostingController, выполняющий роль связующего компонента между двумя фреймворками. Он оборачивает SwiftUI-вью и позволяет подключить его к иерархии UIViewController как обычный дочерний контроллер.

Ключевые моменты

  • Сначала создаётся экземпляр UIHostingController, в конструктор которого передаётся требуемое SwiftUI-вью. Например:
let swiftUIView = MySwiftUIView()
let hostingController = UIHostingController(rootView: swiftUIView)

  • Затем hostingController добавляется в UIKit в качестве дочернего UIViewController:
addChild(hostingController)
view.addSubview(hostingController.view)
hostingController.didMove(toParent: self)

  • После этого настраивается layout hostingController.view — как правило, с использованием Auto Layout или frame, чтобы SwiftUI-вью правильно заняло место в UIKit-иерархии.
  • UIHostingController самостоятельно управляет жизненным циклом SwiftUI-вью и обновляет его после изменения состояния.
  • Данный подход поддерживается начиная с iOS 13. В более новых версиях, включая iOS 14 и выше, обеспечиваются улучшенная производительность и более тесная интеграция с экосистемой SwiftUI.

Практический контекст

Такой способ часто выбирают для UIKit-проектов, в которые требуется добавить отдельные экраны или компоненты на SwiftUI без полной миграции. Это может быть экран настроек, диалоговое окно или специализированный UI-модуль. Распространённый сценарий — большая кодовая база на UIKit, где SwiftUI постепенно внедряется для улучшения UX и ускорения разработки при сохранении совместимости с уже существующим кодом.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку