2016-11-07 9 views
2

Warum var window: UIWindow? nicht UIWindow!, d. H. Warum Fenster optional zu machen, ist nicht jede App sollte eine Haupt UIWindow haben (ohne es die App überhaupt nicht funktionieren kann)?!Warum Fenster Eigenschaft in der UIApplicationDelegate optional statt implizit unwrapped optional?

Ich sah this answer sagte, es hat sich tatsächlich von UIWindow! zu UIWindow? geändert, so muss es einen Grund haben. Ich kann einfach nicht herausfinden warum. Auch mit UIWindow? wird der Typ des Hauptfensters doppelt optional, es ist wirklich peinlich.

Antwort

1

Das liegt daran, dass das Hinzufügen des Schlüssels UIMainStoryboardFile in die .plist-Datei der Anwendung (die standardmäßig hinzugefügt wird) der Grund für die Instanziierung des Fensters ist.

enter image description here

window RootViewController Willen enthält die erste Ansicht Controller des Storyboard und es wird auf dem Bildschirm sichtbar sein.

Testen Sie es!

können wir die window null?

Versuch UIMainStoryboardFile Zeile aus der .plist-Datei des Projektes zu entfernen und versuchen, die window in application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) Methode zur Anmeldung:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    // if your removed 'UIMainStoryboardFile' key from the plist, this should prints nil 
    print(window) 

    return true 
} 
+0

Eigentlich weiß ich, dass UIMainStoryboardFile es erstellt (wie Apple-Dokument sagte). Aber ohne ein UIWindow kann die App überhaupt nicht funktionieren was ist der Zweck, es optional zu machen? – Qiulang

+0

weil in einigen Fällen (wie in "Test it!" Abschnitt in der Antwort erwähnt), Schlüssel möglicherweise nicht existiert, so in diesem Fall Fenster wird Null sein und alles, was Sie sehen werden, ist a schwarzer Bildschirm –

+0

Ich sah Ihre Punkte, aber Sie scheinen nicht meins, zB wer wird eine schwarze Bildschirm-App machen, die die App überhaupt nicht funktioniert? – Qiulang

1

ich diese Frage zu Apfel Ingenieur angehoben und war nach seiner Antwort,

"Ein Beispiel wären Initialisierungsfunktionen für jede benutzerdefinierte Klasse, die einem der Objekte in Ihrem Storyboard zugewiesen ist. Initialisierungsfunktionen werden ausgeführt, bevor eine andere Methode für diese Klasse aufgerufen wird (einschließlich -initWithCoder :, die während des Storyboards aufgerufen wird Wird geladen) . Sie würden ausgeführt, während das Storyboard geladen wird, aber bevor das Fensterobjekt erstellt und dem Anwendungsdelegaten zugewiesen wird. Eine Initialisiererfunktion könnte einen Verweis auf den Anwendungsdelegaten erhalten und versuchen, sein Fenster zu lesen. "