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?
SceneDelegate
oAppDelegate
? 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
activationState
valorforegroundInactive
aquí, que en mi prueba será el caso si se presenta una alerta.foregroundInactive
matt
La 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
keyWindow
no 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 = vc
porque 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.keyWindow
propiedad. 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
NSArray
no 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
extension
son los Swift . 🙂windows
yisKeyWindow
han existido desde iOS 2.0, yfirst(where:)
desde Xcode 9.0 / Swift 4 / 2017.UIApplication.keyWindow
ha 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.window
es 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
UIApplication
extensió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
AppDelegate
clase 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
newWindow
para 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