UIHostingController: SwiftUI wewnątrz UIKit
Osadzanie widoków SwiftUI w aplikacjach UIKit za pomocą UIHostingController.
UIHostingController: SwiftUI wewnątrz UIKit to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.
Czym jest UIHostingController?
UIHostingController to kontroler widoku UIKit, który osadza hierarchię widoków SwiftUI.
import SwiftUI
let swiftUIView = Text("Hello from SwiftUI")
let hostingVC = UIHostingController(rootView: swiftUIView)Osadzanie w UIViewController
Należy dodać kontroler hostujący jako podrzędny kontroler widoku, korzystając ze standardowego API podrzędnych kontrolerów widoku.
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 z kontrolerem hostującym
Należy przypiąć widok kontrolera hostującego za pomocą Auto Layout, aby zintegrować go z układem 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)
])Aktualizowanie widoku głównego
Aby zaktualizować osadzony widok SwiftUI, należy ustawić rootView kontrolera hostującego.
let hostingVC = UIHostingController(rootView: MyView(count: 0))
// Later:
hostingVC.rootView = MyView(count: 5)Prezentowanie modalne
Należy prezentować kontroler hostujący tak jak każdy modal UIKit, uzyskując zawartość SwiftUI w prezentacji UIKit.
let vc = UIHostingController(rootView: MySwiftUIView())
present(vc, animated: true)Umieszczanie na stosie nawigacji
Należy umieścić kontroler hostujący na stosie UINavigationController, aby przejść z UIKit do zawartości SwiftUI.
let vc = UIHostingController(rootView: DetailView())
navigationController?.pushViewController(vc, animated: true)Udostępnianie danych przez ObservableObject
Należy przekazać współdzielony ObservableObject do środowiska widoku SwiftUI, aby zapewnić dwukierunkowy przepływ danych.
let model = SharedModel()
let vc = UIHostingController(rootView: SwiftUIView().environmentObject(model))
// Changes to model in UIKit update SwiftUI and vice versaUstalanie rozmiaru kontrolera hostującego
Należy użyć sizeThatFits, aby obliczyć naturalny rozmiar zawartości SwiftUI podczas osadzania jej w widokach przewijanych.
let size = hostingVC.sizeThatFits(in: CGSize(width: 320, height: UIView.layoutFittingCompressedSize.height))
hostingVC.view.frame.size = sizeWygląd i styl
Należy ustawić overrideUserInterfaceStyle kontrolera hostującego, aby niezależnie sterować trybem ciemnym i jasnym.
hostingVC.overrideUserInterfaceStyle = .darkKonfiguracja aplikacji oparta na scenach
W aplikacji opartej przede wszystkim na UIKit można zastąpić główny kontroler widoku kontrolerem hostującym i przeprowadzić stopniową migrację.
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()
}Przypadki użycia
UIHostingController doskonale nadaje się do stopniowej migracji: można zachować nawigację UIKit, osadzając nowe ekrany funkcji w SwiftUI.
// UIKit app gradually migrated:
// - Old screens: UIViewController
// - New screens: UIHostingController(rootView: NewFeatureView())Szybkie sprawdzenie
Jakiej klasy UIKit należy użyć, aby osadzić widok SwiftUI w hierarchii kontrolerów widoku UIKit?
Podsumowanie lekcji
UIHostingController(rootView:) łączy SwiftUI z UIKit. Należy dodać go jako podrzędny kontroler widoku, używając ograniczeń Auto Layout, albo zaprezentować go lub umieścić na stosie nawigacji. Aktualizację należy wykonywać za pomocą rootView. Dane można udostępniać przez ObservableObject i environmentObject.
Często zadawane pytania
Czy lekcja „UIHostingController: SwiftUI wewnątrz UIKit” jest bezpłatna?
Tak — pełny tekst „UIHostingController: SwiftUI wewnątrz UIKit” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „UIHostingController: SwiftUI wewnątrz UIKit”?
Osadzanie widoków SwiftUI w aplikacjach UIKit za pomocą UIHostingController. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Swift Academy?
Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „UIHostingController: SwiftUI wewnątrz UIKit”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?
Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- UIViewRepresentable: opakowywanie widoków UIKit
- Wzorzec Coordinator do komunikacji z delegatem
- UIViewControllerRepresentable
- UIHostingController: SwiftUI wewnątrz UIKit