Ich verwende Core Data mit Cloud Kit und muss daher den iCloud-Benutzerstatus beim Start der Anwendung überprüfen. Bei Problemen möchte ich dem Benutzer einen Dialog geben, den ich UIApplication.shared.keyWindow?.rootViewController?.present(...)
bisher verwende.
In Xcode 11 Beta 4 gibt es jetzt eine neue Verfallsmeldung, die mir sagt:
'keyWindow' war in iOS 13.0 veraltet: Sollte nicht für Anwendungen verwendet werden, die mehrere Szenen unterstützen, da ein Schlüsselfenster für alle verbundenen Szenen zurückgegeben wird
Wie soll ich stattdessen den Dialog präsentieren?
SceneDelegate
oderAppDelegate
? Und könnten Sie etwas mehr Code posten, damit wir ihn duplizieren können?SceneDelegate
(wenn Sie verwendenSceneDelegate
)Antworten:
Das ist meine Lösung:
Verwendung zB:
quelle
activationState
Wert zu testenforegroundInactive
, was bei meinen Tests der Fall ist, wenn eine Warnung angezeigt wird.foregroundInactive
matt
Lösung ist die, die funktioniert.Die akzeptierte Antwort ist zwar genial, aber möglicherweise zu ausführlich. Sie können viel einfacher genau das gleiche Ergebnis erzielen:
Ich möchte auch darauf hinweisen, dass die Abwertung von
keyWindow
nicht zu ernst genommen werden sollte. Die vollständige Warnmeldung lautet:Wenn Sie also nicht mehrere Fenster auf dem iPad unterstützen, gibt es keine Einwände gegen die weitere Verwendung
keyWindow
.quelle
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "homeVC") as! UITabBarController UIApplication.shared.keyWindow?.rootViewController = vc
da dies mit iOS 13 und der Kartenansicht zu einem Problem wird, da ein Benutzer nach dem Abmelden auf den Anmeldebildschirm mit der Haupt-App in der Ansichtshierarchie verschoben wird, wo er nach unten wischen und welche zurückgeben kann ist problematisch.keyWindow
Immobilie zu vermeiden . Daher die positiven Stimmen. Wenn es dir nicht gefällt, stimme es ab. Aber sag mir nicht, ich soll es ändern, damit es der Antwort eines anderen entspricht. das wäre, wie gesagt, falsch.UIApplication.shared.windows.first(where: \.isKeyWindow)
Dies ist noch einfacher, kürzer und eleganter:
quelle
NSArray
kein Äquivalent zufirst(where:)
. Sie können versuchen, einen Einzeiler mitfilteredArrayUsingPredicate:
und zu erstellenfirstObject:
.first(where:)
:UIApplication.shared.windows.first(where: { $0.isKeyWindow })
UIApplication.shared.windows.first(where: \.isKeyWindow)
Hier ist eine abwärtskompatible Methode zum Erkennen
keyWindow
:Verwendung:
quelle
extension
sind. 🙂windows
undisKeyWindow
haben sich seit iOS 2.0 schon, undfirst(where:)
da Xcode 9.0 / Swift 4 / 2017.UIApplication.keyWindow
wurde unter iOS 13.0 veraltet: @available (iOS, eingeführt: 2.0, veraltet: 13.0, Meldung: "Sollte nicht für Anwendungen verwendet werden, die mehrere Szenen unterstützen, da ein Schlüsselfenster für alle verbundenen Szenen zurückgegeben wird")Normalerweise verwenden
Swift 5
Zusätzlich , im UIViewController:
view.window
ist das aktuelle Fenster für CenesWWDC 2019:
quelle
Für eine Objective-C-Lösung
quelle
Im Idealfall würde ich Ihnen raten, das Fenster im SceneDelegate zu speichern, da es veraltet ist. Wenn Sie jedoch eine temporäre Problemumgehung wünschen, können Sie einen Filter erstellen und das keyWindow wie folgt abrufen.
quelle
Eine
UIApplication
Erweiterung:Verwendung:
quelle
versuche es damit:
quelle
quelle
Auch für eine Objective-C-Lösung
quelle
quelle
Wenn Sie es in einem ViewController verwenden möchten, können Sie es einfach verwenden.
quelle
Inspiriert von der Antwort von Berni
quelle
Wie viele Entwickler, die nach Objective C- Code für den Ersatz dieser Ablehnung fragen . Sie können diesen Code unten verwenden, um das keyWindow zu verwenden.
Ich habe diese Methode
AppDelegate
als Klassenmethode erstellt und in die Klasse eingefügt und sie auf sehr einfache Weise verwendet (siehe unten).Vergessen Sie nicht, diese Methode wie unten in der AppDelegate.h-Klasse hinzuzufügen.
quelle
Ich habe das gleiche Problem getroffen. Ich habe ein
newWindow
für eine Ansicht zugewiesen und festgelegt.[newWindow makeKeyAndVisible];
Wenn Sie es nicht mehr verwenden, legen Sie es fest[newWindow resignKeyWindow];
und versuchen Sie dann, das ursprüngliche Schlüsselfenster direkt von anzuzeigen[UIApplication sharedApplication].keyWindow
.Unter iOS 12 ist alles in Ordnung, aber unter iOS 13 kann das ursprüngliche Tastenfenster nicht normal angezeigt werden. Es zeigt einen ganzen weißen Bildschirm.
Ich habe dieses Problem gelöst durch:
Ich hoffe es hilft.
quelle