«keyWindow» ist veraltet. Was tun?
\n\nWenn Sie jemals geschrieben haben:
\n\nguard let window = UIApplication.shared.keyWindow else { return }\n\n…dann haben Sie sicherlich die gelbe Xcode-Warnung gesehen: «'keyWindow' was deprecated in iOS 13.0». Dies ist eine der häufigsten Fragen auf Stack Overflow (über 100.000 Aufrufe), und das aus gutem Grund – Apple hat die Regeln tatsächlich geändert.
\n\nIn diesem Artikel werden wir analysieren, warum dies passiert ist, und 4 Ansätze vergleichen, wie Sie das App-Fenster ohne die deprecated API erhalten. Sie erfahren, welche Methode für UIKit, SwiftUI, SceneDelegate geeignet ist und wann Sie welche verwenden sollten. Los geht's!
\n\nWarum hat Apple keyWindow aufgegeben?
\n\nVor iOS 13 hatte eine App ein Hauptfenster – keyWindow. Alles war einfach: Man nimmt es und arbeitet damit. Aber mit dem Aufkommen von iPadOS und Multitasking (Split View, Slide Over) kann eine App mehrere Fenster gleichzeitig haben. Jedes Fenster wird von seiner eigenen UIWindowScene verwaltet. Der Begriff «Schlüsselfenster» wurde unscharf.
Apple empfiehlt nun, das Fenster über die Szene (UIWindowScene) zu erhalten, zu der Ihr Controller oder View gehört.
\n\nVergleich der Ansätze: Vom Einfachen zum Richtigen
\n\nWir betrachten 4 Methoden, von «Warnung schnell unterdrücken» bis «nach Apple-Art». Wählen Sie die, die zu Ihrer Architektur passt.
\n\n1. Schneller Fix: UIApplication.shared.windows.first(where:)
\n\nDie beliebteste Antwort auf Stack Overflow ist die Verwendung der Eigenschaft windows anstelle von keyWindow:
if let window = UIApplication.shared.windows.first(where: { $0.isKeyWindow }) {\n // window verwenden\n}\n\nVorteile:
\n- \n
- Minimale Code-Änderungen \n
- Funktioniert ab iOS 13+ \n
Nachteile:
\n- \n
- Weiterhin unsicher bei mehreren Fenstern \n
- Kann nil zurückgeben, wenn das Fenster noch nicht erstellt wurde \n
- Apple markiert dies in einigen Kontexten weiterhin als «deprecated» \n
Wann verwenden: Nur für schnelle Prototypen oder wenn Sie definitiv nur ein Fenster haben (z. B. iPhone-App ohne Multi-Fenster-Funktionalität).
\n\n2. Über SceneDelegate: Der richtige Weg für UIKit
\n\nAb iOS 13 hat Apple UISceneDelegate eingeführt. In der Methode scene(_:willConnectTo:options:) erhalten Sie eine UIWindowScene und können eine Referenz auf das Fenster speichern.
Schritt 1: Deklarieren Sie in SceneDelegate.swift die Eigenschaft window:
class SceneDelegate: UIResponder, UIWindowSceneDelegate {\n\n var window: UIWindow?\n\n func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {\n guard let windowScene = (scene as? UIWindowScene) else { return }\n window = UIWindow(windowScene: windowScene)\n window?.rootViewController = ViewController()\n window?.makeKeyAndVisible()\n }\n}\n\nSchritt 2: Holen Sie sich das Fenster über die Szene:
\n\nif let windowScene = view.window?.windowScene,\n let window = windowScene.windows.first {\n // window verwenden\n}\n\nOder, wenn Sie das Hauptfenster an einer beliebigen Stelle in der App benötigen, speichern Sie eine Referenz auf den SceneDelegate und dessen window.
Vorteile:
\n- \n
- Entspricht vollständig den Apple-Empfehlungen \n
- Funktioniert korrekt mit mehreren Fenstern \n
- Sicher für Multitasking auf dem iPad \n
Nachteile:
\n- \n
- Erfordert die Einrichtung von SceneDelegate (falls Sie noch nicht umgestiegen sind) \n
- Etwas mehr Code \n
3. Über UIWindowScene.activeWindow (iOS 15+)
\n\nAb iOS 15 hat UIWindowScene
Blogs
Buchempfehlungen
Lesen Sie auch
SOLID-Prinzipien in C#: Theorie und Praxis von A bis Z
Arbeiten mit dem Dateisystem in JavaScript: Ein praktischer Leitfaden für Node.js
Go Struct in JSON: Vollständiger Leitfaden mit Beispielen für Anfänger
Arbeiten mit dem Dateisystem in C#: praktische Beispiele für .NET
Python-Bot mit telegram-bot-api erstellen: Anleitung