Estoy usando Core Data con Cloud Kit y, por lo tanto, tengo que verificar el estado del usuario de iCloud durante el inicio de la aplicación. En caso de problemas quiero emitir un diálogo al usuario, y lo hago usando UIApplication.shared.keyWindow?.rootViewController?.present(...)hasta ahora.
En Xcode 11 beta 4, ahora hay un nuevo mensaje de desaprobación que me dice:
'keyWindow' quedó obsoleto en iOS 13.0: no debe usarse para aplicaciones que admitan múltiples escenas, ya que devuelve una ventana clave en todas las escenas conectadas
¿Cómo debo presentar el diálogo en su lugar?

SceneDelegateoAppDelegate? Y, ¿podrías publicar un poco más de código para que podamos duplicarlo?SceneDelegate(si está usandoSceneDelegate)Respuestas:
Esta es mi solucion:
Uso, por ejemplo:
fuente
activationStatevalorforegroundInactiveaquí, que en mi prueba será el caso si se presenta una alerta.foregroundInactivemattLa solución es la que funciona.La respuesta aceptada, aunque ingeniosa, puede ser demasiado elaborada. Puede obtener exactamente el mismo resultado de manera mucho más simple:
También quisiera advertir que la desaprobación de
keyWindowno debe tomarse demasiado en serio. El mensaje de advertencia completo dice:Por lo tanto, si no admite varias ventanas en iPad, no hay objeción a seguir adelante y continuar usándolo
keyWindow.fuente
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "homeVC") as! UITabBarController UIApplication.shared.keyWindow?.rootViewController = vcporque con iOS 13 y la vista de tarjeta esto se convierte en un problema porque un usuario después de decir que cierra la sesión será empujado a la pantalla de inicio de sesión con la aplicación principal en la jerarquía de vista donde puede deslizar hacia abajo y devolver cuál? es problemático.keyWindowpropiedad. De ahí los votos positivos. Si no te gusta, dale un voto negativo. Pero no me digas que lo cambie para que coincida con la respuesta de otra persona; eso, como dije, estaría mal.UIApplication.shared.windows.first(where: \.isKeyWindow)Mejorando ligeramente la excelente respuesta de Matt, esto es aún más simple, más corto y más elegante:
fuente
NSArrayno tiene un equivalente afirst(where:). Puede intentar componer una sola línea confilteredArrayUsingPredicate:yfirstObject:.first(where:):UIApplication.shared.windows.first(where: { $0.isKeyWindow })UIApplication.shared.windows.first(where: \.isKeyWindow)Aquí hay una forma de detección compatible con versiones anteriores
keyWindow:Uso:
fuente
extensionson los Swift . 🙂windowsyisKeyWindowhan existido desde iOS 2.0, yfirst(where:)desde Xcode 9.0 / Swift 4 / 2017.UIApplication.keyWindowha quedado en desuso en iOS 13.0: @disponible (iOS, introducido: 2.0, en desuso: 13.0, mensaje: "No debe usarse para aplicaciones que admitan múltiples escenas, ya que devuelve una ventana clave en todas las escenas conectadas")Para una solución Objective-C
fuente
Usualmente usa
Rápido 5
Además, en UIViewController:
view.windowes la ventana actual para cenesWWDC 2019:
fuente
Idealmente, dado que ha quedado obsoleto, le aconsejo que almacene la ventana en SceneDelegate. Sin embargo, si desea una solución temporal, puede crear un filtro y recuperar el keyWindow así.
fuente
Una
UIApplicationextensión:Uso:
fuente
prueba con eso:
fuente
También para una solución Objective-C
fuente
Si desea usarlo en cualquier ViewController, simplemente puede usar.
fuente
fuente
fuente
Inspirado por la respuesta de berni
fuente
Como muchos de los desarrolladores que solicitan el código Objective C del reemplazo de esta depreciación. Puede usar este código a continuación para usar keyWindow.
Creé y agregué este método en la
AppDelegateclase como un método de clase y lo uso de la manera muy simple que se muestra a continuación.No olvide agregar este método en la clase AppDelegate.h como se muestra a continuación.
fuente
Me encontré con el mismo problema. Asigné un
newWindowpara una vista, y lo configuré[newWindow makeKeyAndVisible];Cuando termine de usarlo, configúrelo[newWindow resignKeyWindow];y luego intente mostrar la ventana clave original directamente por[UIApplication sharedApplication].keyWindow.Todo está bien en iOS 12, pero en iOS 13 la ventana de teclas original no se puede mostrar normalmente. Muestra una pantalla entera en blanco.
Resolví este problema por:
Espero eso ayude.
fuente