Cómo saber si la vista de UIViewController es visible

Resuelto Rob Bonner asked hace 55 años • 18 respuestas

Tengo una aplicación de barra de pestañas, con muchas vistas. ¿ Hay alguna manera de saber si un particular UIViewControlleres visible actualmente desde dentro de UIViewController? (buscando una propiedad)

Rob Bonner avatar Jan 01 '70 08:01 Rob Bonner
Aceptado

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 .

progrmr avatar May 05 '2010 23:05 progrmr

Aquí está la solución de @progrmr como UIViewControllercategorí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
ma11hew28 avatar Jun 30 '2011 03:06 ma11hew28

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;
}
vincentjames501 avatar Feb 04 '2014 14:02 vincentjames501

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
}
Benjamin avatar Apr 04 '2016 15:04 Benjamin