Как открывать экраны UIKit в SwiftUI и наоборот

Как открывать экраны UIKit в SwiftUI и наоборот

При переходе с UIKit на SwiftUI или при интеграции старых экранов UIKit в новый SwiftUI-проект часто возникает необходимость взаимодействия между этими фреймворками. В этой статье рассмотрим, как открывать UIViewController в SwiftUI и наоборот.

Открытие экрана UIKit в SwiftUI

Для интеграции UIViewController в SwiftUI используется UIViewControllerRepresentable.

Шаги:

  • Создайте структуру, реализующую UIViewControllerRepresentable.
  • Реализуйте методы makeUIViewController(context:) и updateUIViewController(_:context:).
  • Используйте эту структуру в SwiftUI как обычное представление.

Пример:

import SwiftUI import UIKit struct UIKitViewControllerWrapper: UIViewControllerRepresentable { func makeUIViewController(context: Context) -> UIViewController { return MyUIKitViewController() // ваш UIViewController } func updateUIViewController(_ uiViewController: UIViewController, context: Context) {} } struct ContentView: View { @State private var showUIKitScreen = false var body: some View { Button("Открыть UIKit экран") { showUIKitScreen = true } .sheet(isPresented: $showUIKitScreen) { UIKitViewControllerWrapper() } } }

Этот код открывает MyUIKitViewController внутри SwiftUI при нажатии кнопки.

Открытие экрана SwiftUI в UIKit

Для отображения SwiftUI-вью в UIKit используется UIHostingController.

Шаги:

  • Создайте UIHostingController, передав в него SwiftUI-вью.
  • Отобразите UIHostingController стандартным способом через present или pushViewController.

Пример:

import SwiftUI import UIKit struct SwiftUIScreen: View { var body: some View { Text("Привет, SwiftUI!") .font(.largeTitle) .padding() } } class UIKitViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white let button = UIButton(type: .system) button.setTitle("Открыть SwiftUI", for: .normal) button.addTarget(self, action: #selector(openSwiftUI), for: .touchUpInside) button.frame = CGRect(x: 50, y: 100, width: 200, height: 50) view.addSubview(button) } @objc func openSwiftUI() { let swiftUIView = SwiftUIScreen() let hostingController = UIHostingController(rootView: swiftUIView) present(hostingController, animated: true, completion: nil) } }

Этот код открывает экран SwiftUI (SwiftUIScreen) из UIKitViewController при нажатии кнопки.

Итог

Интеграция UIKit и SwiftUI возможна в обоих направлениях:

  • Для отображения UIViewController в SwiftUI используется UIViewControllerRepresentable.
  • Для отображения SwiftUI в UIKit применяется UIHostingController.

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

Начать дискуссию