Die oben genannten Antworten nur wer das Fenster Variable setzt, ohne die wichtigsten Fragen zu beantworten: „Aber wie funktioniert Fenster haben einen nicht-Null RootViewController wenn es nie explizit initialisiert wird, ist dies nur Xcode init'ing hinter den Kulissen? " und scheinen darauf hinzuweisen, dass Magie im Gange ist. Keine befriedigende Antwort für mich, und mit ein wenig Graben wird alles klar.
Der generierte Code AppDelegate als
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
...
}
definiert Wenn Sie das Projekt suchen, gibt es keine andere Referenz auf Fenster, so offenbar sollte es bleiben null, aber tatsächlich ist auf den korrekten Wert (durch die Verfahren eingestellt oben skizziert). Der „Magic“ ist, dass AppDelegate zum UIApplicationDelegate entspricht, die eine Angabe enthält:
optional public var window: UIWindow? { get set }
Teil zum UIApplicationDelegate konformen wird die Neudeklaration des öffentlichen variable Fenster. Wenn die zugrunde liegende Anwendung im Protokoll auf die Variable window verweist, ist sie tatsächlich mit der Variablen Fenster in unserer Klasse verknüpft. Wenn die aufrufende Anwendung diese Variable Fenster im Protokoll aktualisiert, aktualisiert sie tatsächlich unsere Variable Fenster. Wenn wir also auf den Wert in unserem Programm zugreifen müssen, ist es bereit und wartet.
Dies ist nicht Xcode Magie, sondern ein integraler Bestandteil der Swift Sprache. Bei der Verwendung von Protokollen können wir die gleichen Techniken in unseren eigenen Swift-Programmen verwenden. Dies ist genau das gleiche wie unsere Implementierungen von verschiedenen Funktionen in unseren Klassen, die wir die ganze Zeit machen: z.B. UIApplicationDelegate definiert
optional public func applicationDidEnterBackground(_ application: UIApplication)
so können wir unsere eigene Implementierung schreiben, die dann „magische Weise“ genannt!
Der Vollständigkeit halber beachten Sie das @ UIApplicationMain Tag auf der Klasse. Dies definiert den Einstiegspunkt für die Anwendung und sorgt dafür, dass alles zusammenarbeitet. Der tatsächliche Klassenname ist irrelevant und kann einen beliebigen Namen erhalten, so lange er vom Typ UIResponder ist und dem UIApplicationDelegate entspricht.
Das antwortet sehr gut, wer die Fenstereigenschaft aktualisiert, aber siehe meine Antwort unten für wie es gemacht wird. – Mythlandia