Beste antwoord
UIWindow is een klasse in UIKit, het UI-framework voor iOS (en tvOS en watchOS).
Wanneer u een app start, is het gebruikelijke proces om iets weer te geven het maken van een UIWindow, een UIViewController maken met de weergave die u wilt weergeven en vervolgens de “root view controller” van de UIWindow instellen op de UIViewController.
Als u een op storyboard gebaseerde app maakt, wordt dit voor u gedaan. U kunt de “Hoofdinterface” instellen, en dat .storyboard-bestand wordt geladen als de rootview-controller. Je hebt toegang tot deze UIWindow in AppDelegate.
Als je geen storyboards gebruikt, heb je zoiets als dit stukje code nodig
var window: UIWindow?
func application(\_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
window = UIWindow(frame: UIScreen.main.bounds)
let vc = CustomViewController()
window?.rootViewController = vc
window?.makeKeyAndVisible()
}
in de didFinishLaunching-functie van AppDelegate om het UIWindow te maken en de rootview-controller in te stellen op jouw app. Merk op dat om het UIWindow zichtbaar te maken op het scherm, u het alleen als zichtbaar hoeft in te stellen, in plaats van het toe te voegen als een subview of het in een andere hiërarchie te plaatsen.
Gewoonlijk om meer view controllers te tonen andere dan de rootview-controller, je kunt ze modaal presenteren of een navigatie- / tabcontroller gebruiken, dus er zijn niet echt heel veel redenen om meer vensters in je app te maken.
Een reden kan zijn om een waarschuwing weer te geven of een in-app-meldingssysteem hebben, waarbij u een UI-element boven al het andere in uw app wilt weergeven (zelfs boven het toetsenbord en sommige systeemwaarschuwingen denk ik).
Of als uw app daadwerkelijk profiteert van twee schermen (dwz via AirPlay), dan moet u een nieuw UIWindow maken, het scherm instellen op dat van het secundaire scherm, de rootview-controller instellen en het vervolgens instellen als zichtbaar.
Om direct te adresseren uw tweede vraag, ik veronderstel dat u zou kunnen meerdere UIWindows toevoegen als subweergaven van de weergave van een viewcontroller (zoals UIWindow doet subklasse UIView), maar dat is zeker niet hoe ze gewoonlijk worden gebruikt, en ik weet niet echt hoe dat eruit zou zien.
Antwoord
Ten eerste heeft UIWindow niets te maken hebben met Swift. Het maakt op geen enkele manier deel uit van de Swift-taal. Het maakt deel uit van het UIKit-framework van Apple, dat momenteel het standaard UI-framework voor iOS is (en binnenkort het standaard UI-framework voor MacOS). UIViewController is ook onderdeel van UIKit.
Een UIWindow bevat de gebruikersinterface van uw app. Het is wat gebeurtenissen van gebruikersinteractie naar uw weergaven stuurt. Een typische iOS-app heeft één UIWindow.
Een UIViewController bevat geen enig UIWindow objecten en zou een slechte ontwerpbeslissing zijn als dat het geval was.
Ik raad aan de documentatie te lezen: UIKit | Apple Developer Documentation