J'utilise Core Data avec Cloud Kit et je dois donc vérifier l'état de l'utilisateur iCloud lors du démarrage de l'application. En cas de problème, je souhaite lancer une boîte de dialogue à l'utilisateur, et je le fais en utilisant UIApplication.shared.keyWindow?.rootViewController?.present(...)
jusqu'à présent.
Dans Xcode 11 beta 4, il y a maintenant un nouveau message d'obsolescence, me disant:
'keyWindow' était obsolète dans iOS 13.0: ne doit pas être utilisé pour les applications qui prennent en charge plusieurs scènes car il renvoie une fenêtre clé sur toutes les scènes connectées
Comment présenter le dialogue à la place?
SceneDelegate
ouAppDelegate
? Et, pourriez-vous publier un peu plus de code afin que nous puissions dupliquer?SceneDelegate
(si vous utilisezSceneDelegate
)Réponses:
Voici ma solution:
Utilisation par exemple:
la source
activationState
valeurforegroundInactive
ici, ce qui dans mes tests sera le cas si une alerte est présentée.foregroundInactive
matt
la solution est celle qui fonctionne.La réponse acceptée, bien qu'ingénieuse, pourrait être trop élaborée. Vous pouvez obtenir exactement le même résultat beaucoup plus simplement:
Je voudrais également avertir que la dépréciation de
keyWindow
ne doit pas être prise trop au sérieux. Le message d'avertissement complet se lit comme suit:Donc, si vous ne supportez pas plusieurs fenêtres sur iPad, il n'y a aucune objection à continuer et à continuer à utiliser
keyWindow
.la source
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "homeVC") as! UITabBarController UIApplication.shared.keyWindow?.rootViewController = vc
car avec iOS 13 et la vue de la carte, cela devient un problème car un utilisateur après avoir dit se déconnecter sera poussé vers l'écran de connexion avec l'application principale dans la hiérarchie de la vue où il peut glisser vers le bas et retourner ce qui est problématique.keyWindow
propriété. D'où les votes positifs. Si vous ne l'aimez pas, votez contre. Mais ne me dites pas de le changer pour correspondre à la réponse de quelqu'un d'autre; cela, comme je l'ai dit, serait faux.UIApplication.shared.windows.first(where: \.isKeyWindow)
Améliorant légèrement l'excellente réponse de matt, c'est encore plus simple, plus court et plus élégant:
la source
NSArray
n'a malheureusement pas d'équivalent àfirst(where:)
. Vous pouvez essayer de composer un one-liner avecfilteredArrayUsingPredicate:
etfirstObject:
.first(where:)
:UIApplication.shared.windows.first(where: { $0.isKeyWindow })
UIApplication.shared.windows.first(where: \.isKeyWindow)
Voici une méthode de détection rétrocompatible
keyWindow
:Usage:
la source
extension
sont belles . 🙂windows
et existentisKeyWindow
depuis iOS 2.0 etfirst(where:)
depuis Xcode 9.0 / Swift 4 / 2017.UIApplication.keyWindow
est obsolète sur iOS 13.0: @available (iOS, introduit: 2.0, obsolète: 13.0, message: "Ne doit pas être utilisé pour les applications qui prennent en charge plusieurs scènes car il renvoie une fenêtre clé sur toutes les scènes connectées")Utiliser habituellement
Swift 5
En plus , dans l'UIViewController:
view.window
est la fenêtre actuelle pour les cenesWWDC 2019:
la source
Pour une solution Objective-C
la source
Idéalement, comme il est obsolète, je vous conseillerais de stocker la fenêtre dans SceneDelegate. Toutefois, si vous souhaitez une solution de contournement temporaire, vous pouvez créer un filtre et récupérer la keyWindow comme ceci.
la source
Une
UIApplication
extension:Usage:
la source
essayez avec ça:
la source
Pour une solution Objective-C aussi
la source
Si vous souhaitez l'utiliser dans n'importe quel ViewController, vous pouvez simplement l'utiliser.
la source
la source
la source
Inspiré par la réponse de berni
la source
Autant de développeurs qui demandent du code Objective C pour remplacer cette dépréciation. Vous pouvez utiliser ce code ci-dessous pour utiliser keyWindow.
J'ai créé et ajouté cette méthode dans la
AppDelegate
classe en tant que méthode de classe et je l'utilise de manière très simple ci-dessous.N'oubliez pas d'ajouter cette méthode dans la classe AppDelegate.h comme ci-dessous.
la source
J'ai rencontré le même problème. J'ai alloué un
newWindow
pour une vue, et l' ai défini. Lorsque vous avez[newWindow makeKeyAndVisible];
fini de l'utiliser, réglez[newWindow resignKeyWindow];
-le puis essayez d'afficher la fenêtre clé d'origine directement par[UIApplication sharedApplication].keyWindow
.Tout va bien sur iOS 12, mais sur iOS 13, la fenêtre principale d'origine ne peut pas être affichée normalement. Il montre un écran blanc entier.
J'ai résolu ce problème en:
J'espère que ça aide.
la source