Parece que no puedo obtener el máximo UIViewController
sin acceso a a UINavigationController
. Esto es lo que tengo hasta ahora:
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(vc, animated: true, completion: nil)
Sin embargo, no parece hacer nada. Los keyWindow
y rootViewController
parecen ser valores no nulos también, por lo que el encadenamiento opcional no debería ser un problema.
NOTA: es una mala idea hacer algo como esto. Rompe el patrón MVC.
swift
uiviewcontroller
Zoyt
fuente
fuente
Respuestas:
presentViewController
muestra un controlador de vista. No devuelve un controlador de vista. Si no está utilizando unUINavigationController
, probablemente esté buscandopresentedViewController
y deberá comenzar desde la raíz e iterar hacia abajo a través de las vistas presentadas.Para Swift 3+:
Para iOS 13+
fuente
topController.presentedViewController
devuelve algo (es decir, el controlador tiene un controlador secundario presentado). Eswhile let
para hacer cumplir el hecho de quetopController.presentedViewController
debe devolver algo. Si devuelve nil (es decir, este controlador no tiene hijos presentados), entonces dejará de repetirse. En el cuerpo del bucle, reasigna al hijo como el actualtopController
y vuelve a recorrerlo, bajando la jerarquía del controlador de vista. Se puede reasignartopController
como es unvar
en laif
declaración externa .while let
. Por supuesto, hay muchosif let
ejemplos por encontrar.let x = somethingThatCouldBeNil
sintaxis es un truco muy útil para usar en cualquier lugar donde se pueda usar un valor / condición de verdad. Si no lo usáramos aquí, tendríamos que asignar explícitamente un valor, luego probar para ver si realmente está allí. Creo que es realmente sucinto y expresivo.tener esta extensión
Swift 2. *
Swift 3
Puedes usar esto en cualquier lugar de tu controlador
fuente
return
). ¿Cómo puede entrar en un bucle infinito?Para un rápido 4/5 + para obtener la vista más alta
Cómo utilizar
fuente
Uso:
fuente
return UIWindow.getVisibleViewControllerFrom(presentedViewController.presentedViewController!)
.presentedViewController.presentedViewController
o no?Basado en la respuesta de Dianz, la versión Objective-C
fuente
Me encantó la respuesta de @ dianz , así que aquí está la versión de Swift 3. Básicamente es lo mismo, pero le faltaba una llave y algunos de los nombres de sintaxis / variable / método han cambiado. ¡Asi que aqui esta!
Sin embargo, el uso sigue siendo exactamente el mismo:
fuente
https://gist.github.com/db0company/369bfa43cb84b145dfd8 Hice algunas pruebas sobre las respuestas y comentarios en este sitio. Para mí, los siguientes trabajos
Luego, obtenga la vista superior Controlador por:
fuente
Use este código para encontrar los mejores UIViewController
fuente
Variación leve en @AlberZou usando una variable calculada en lugar de una función
Luego dice
fuente
Basado en Bob -c arriba:
Swift 3.0
fuente
Demasiados sabores pero ninguno uno elaborado e iterativo. Combinado de los anteriores:
fuente
puede definir una variable UIViewController en AppDelegate, y en cada vista WillAppear establecer la variable en self (sin embargo, dianz answer es la mejor respuesta).
fuente
Para encontrar la vista visible Controlador en Swift 3
Este código encuentra visible el último controlador agregado o el último controlador activo.
Esto lo he usado en AppDelegate para encontrar el controlador de vista activa
fuente
fuente
¿Dónde pusiste el código?
Probé tu código en mi demo, descubrí, si pones el código en
fallará, porque la ventana clave se ha configurado todavía.
Pero puse tu código en algún controlador de vista
Simplemente funciona
fuente
didFinishLaunchingWithOptions
. Solo necesito esto para varios propósitos de depuración.En un caso muy raro, con segue personalizado, el controlador de la vista superior no está en una pila de navegación o controlador de barra de pestañas o presentado, pero su vista se inserta en la parte superior de las subvistas de ventanas clave.
En tal situación, es necesario verificar si
UIApplication.shared.keyWindow.subviews.last == self.view
para determinar si el controlador de vista actual es el más alto.fuente
Para cualquiera que busque una solución rápida 5 / iOS 13+ (
keywindow
está en desuso desde iOS 13)fuente
UIApplication.getTopMostViewController()
dentro de su ViewController. @ChrisComasfuente
La mejor solución para mí es una extensión con una función. Crea un archivo rápido con esta extensión
Primero es la extensión UIWindow :
dentro de esa función de agregar archivo
Y si desea usarlo, puede llamarlo en cualquier lugar. Ejemplo :
El código del archivo es así :
fuente