Tengo una vista que es UIViewController
(raíz) que maneja los anuncios y UINavigationController
. En ese UINavigationController tengo capas típicas de controladores. En mi controlador de vista de tabla de configuraciones personalizadas, tengo un botón para contactarme para soporte. Cuando el usuario hace clic en este botón, creo un MFMailComposeViewController
y me gustaría presentarlo. No puedo presentarlo desde la vista de tabla de configuración, ya que estará debajo de mis anuncios, por lo que necesito hacer referencia a la vista raíz y presentarla desde allí. He intentado self.parentViewController.parentViewController
donde self es la vista de tabla de configuraciones, pero eso no funciona. ¿Cómo debería hacer referencia a esto? Parece un mal diseño tener que hacer referencia directamente a la vista raíz y pasarla a la vista de configuración.Cómo encontrar Root UIViewController
Respuesta
Obtener el keyWindow actual:
UIWindow *window = [UIApplication sharedApplication].keyWindow;
Obtener su RootViewController:
UIViewController *rootViewController = window.rootViewController;
NOTA: Si actualmente se muestra un UIAlertView
, un nuevo viento ow se está creando y asignando para ser la ventana clave. También puede haber otros casos excepcionales que no mantengan la ventana de la aplicación como la ventana clave.
Esto solo funciona en 4.0+ por cierto. UIWindow no tenía una propiedad rootViewController anterior a 4.0. –
@Jesse buen punto - Estoy tan contento de no tener que soportar esos ladrillos antiguos nunca más;). – Till
sí, apesta. Yo diría que es al menos el 50% de mi tiempo. –
Utilice la aplicación singleton. Algo así como:
[[[UIApplication sharedApplication] delegate] rootViewController]
debe conseguirlo si su viewController que es la raíz se llama rootViewController
Obtiene el objeto UIApplication. Haz un ciclo por la matriz de ventanas para encontrar la ventana clave. Y luego obtenga la propiedad rootViewController.
En mi experiencia, esta es la solución ideal para obtener el rootViewController
:
[[[[UIApplication sharedApplication] delegate] window] rootViewController]
Nota: En caso de un activo UIAlert
o UIActionSheet
, se obtiene la Hoja de alerta o acción como su ventana de clave .
+1 Esta es la única manera segura y confiable de hacerlo. Tomó años para que rastreara un error de alerta + keyWindow, ¡y esta publicación me salvó! – stonemonk
¡Segundo eso! El enfoque keyWindow (actualmente marcado como la respuesta correcta) no es confiable, ya que la ventana clave puede cambiar. –
también tenía un error al usar KeyWindow durante un UIAlertView ... ¡gracias por esto! este es el mejor método para usar. – manroe
Siempre se puede resolver esto con 1 línea de código pero recomiendo esta manera Swift hacerlo, puede llamar a esto desde cualquier lugar, su también de choque y fallo de seguridad:
/// EZSwiftExtensions - Gives you the VC on top so you can easily push your popups
var topMostVC: UIViewController? {
var presentedVC = UIApplication.sharedApplication().keyWindow?.rootViewController
while let pVC = presentedVC?.presentedViewController {
presentedVC = pVC
}
if presentedVC == nil {
print("EZSwiftExtensions Error: You don't have any views set. You may be calling them in viewDidLoad. Try viewDidAppear instead.")
}
return presentedVC
}
Su incluido como estándar en función de:
- 1. Cómo recargar UIViewController
- 2. Cómo obtener el Root raíz
- 3. git root branches ... ¿cómo funcionan?
- 4. ¿Cómo funcionan UINavigationController y UIViewController?
- 5. Cómo configurar parentViewController en UIViewController?
- 6. ¿Cómo creo un UIViewController programáticamente?
- 7. PHP secure root
- 8. UIView vs UIViewController
- 9. Imagen de fondo UIViewController
- 10. empujar uiviewcontroller de presentModalViewController
- 11. Obtener el máximo UIViewController
- 12. ¿Cómo obtener privilegios de root mediante programación?
- 13. ¿Cómo elimino completamente la contraseña de root?
- 14. ¿Cómo puedo redirigir a root - public/index.html?
- 15. anidamiento GLKView en UIViewController
- 16. Oprimir privilegios de root
- 17. Calcular nth root?
- 18. Root Nodes en JSON
- 19. ManagementScope y "root \ cimv2"?
- 20. xampp change document root
- 21. Symfony2: configuración personalizada root
- 22. ¿Cómo elimino UINavigationBar de un UIViewController?
- 23. ¿Cómo puedo crear un UIViewController modal translúcido?
- 24. cómo establecer backgroundcolor de UIViewController en iphone?
- 25. iPhone: cómo configurar el marco UIViewController?
- 26. ¿Cómo presento un UIViewController haciendo zoom?
- 27. ¿Cómo interactuar con UITableView en UIViewController?
- 28. ¿Cómo sabe UIView nextResponder qué es UIViewController?
- 29. Cómo agregar UINavigationBar en un UIViewController?
- 30. Grails createLink to project root?
¿Ha intentado self.navigationController? No estoy seguro de cómo está configurada su jerarquía de vistas. – jaminguy