Cómo saber si la vista de UIViewController es visible
Tengo una aplicación de barra de pestañas, con muchas vistas. ¿ Hay alguna manera de saber si un particular UIViewController
es visible actualmente desde dentro de UIViewController
? (buscando una propiedad)
La propiedad de la ventana de la vista no es nula si una vista está visible actualmente, así que verifique la vista principal en el controlador de vista:
Invocar el método de vista hace que la vista se cargue (si no está cargada), lo cual es innecesario y puede no ser deseable. Sería mejor comprobar primero si ya está cargado. Agregué la llamada a isViewLoaded para evitar este problema.
if (viewController.isViewLoaded && viewController.view.window) {
// viewController is visible
}
Desde iOS9 se ha vuelto más fácil:
if viewController.viewIfLoaded?.window != nil {
// viewController is visible
}
O si tiene un UINavigationController que administra los controladores de vista, puede verificar su propiedad visibleViewController .
Aquí está la solución de @progrmr como UIViewController
categoría:
// UIViewController+Additions.h
@interface UIViewController (Additions)
- (BOOL)isVisible;
@end
// UIViewController+Additions.m
#import "UIViewController+Additions.h"
@implementation UIViewController (Additions)
- (BOOL)isVisible {
return [self isViewLoaded] && self.view.window;
}
@end
Hay un par de problemas con las soluciones anteriores. Si está utilizando, por ejemplo, a UISplitViewController
, la vista maestra siempre devolverá verdadero para
if(viewController.isViewLoaded && viewController.view.window) {
//Always true for master view in split view controller
}
En su lugar, adopte este enfoque simple que parece funcionar bien en la mayoría de los casos, si no en todos:
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
//We are now invisible
self.visible = false;
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
//We are now visible
self.visible = true;
}
Para aquellos que buscan una versión Swift 2.2 de la respuesta:
if self.isViewLoaded() && (self.view.window != nil) {
// viewController is visible
}
y rápido 3 :
if self.isViewLoaded && (self.view.window != nil) {
// viewController is visible
}