2010-09-09 9 views
46

Duplicar posible:
How to tell if UIViewController's view is visible¿Cómo comprobar si una vista específica de UIViewController está actualmente visible?

Estoy desarrollando una aplicación que procesa un flujo constante de datos entrantes de la red y proporciona un número de diferentes UIViews para el usuario de que lo datos.

Cuando ciertos datos del modelo se actualizan en función de la corriente entrante de la red, accedo al UIViewController o UITableViewController asociado y hago -setNeedsDisplay en él (en el caso de UIViewController) o -reloadData (en el caso de UITableViewController).

¿Hay alguna forma de comprobar si actualmente se está visualizando una UIView determinada (más allá de solo cargarla) para que solo haga -setNeedsDisplay o -reloadData si el usuario está mirando actualmente esa UIView? Parecería que llamar -setNeedsDisplay o reloadData en una vista que el usuario no está mirando actualmente es una pérdida de potencia de procesamiento y no sería bueno para la duración de la batería. Cuando el usuario finalmente cambia a una vista que previamente se actualizó, hacer -setNeedsDisplay o reloadData en -viewWillAppear tendría más sentido.

Gracias

+0

http://stackoverflow.com/questions/2777438/how-to-tell-if-uiviewcontrollers-view-is-visible/2777460#2777460 – LolaRun

+0

No puedo agregar otra respuesta, pero ahora hay una propiedad llamado isVisible en controladores de vista –

Respuesta

132

Después de hacer algunas investigaciones, he encontrado esta respuesta en una pregunta diferente publicado aquí ... Esta parece ser la mejor manera ...

El propiedad de la ventana de vista es no-nil si el fin es actualmente visible, a fin de comprobar la vista principal en el controlador de vista:

if (viewController.isViewLoaded && viewController.view.window){ 
    // viewController is visible 
} 
+5

Acabo de editar [la otra pregunta] (http://stackoverflow.com/questions/2777438/how-to-tell-if-uiviewcontrollers-view-is-visible/2777460#2777460) para verificar también isViewLoaded primero para evitar accidentalmente cargando la vista que hará este código de arriba. Realice la prueba: 'if (viewController.isViewLoaded && viewController.view.window) ...' – progrmr

+1

Esta respuesta no debe marcarse como correcta, ya que activará la carga de la vista de VC. Ver la respuesta del programador vinculada anteriormente. –

+2

Esto le dará los falsos positivos para viewControllers que están obstruidos por otros viewControllers de visualización modal -> no de la manera correcta.Lo que hace esto es una verificación confiable de una vista. El controlador NO es visible, pero no al revés. – Till

12

Añadir esto a sus controladores, o para una subclase de UIViewController que luego puede subclase más. Puede acceder a él usando una propiedad o la variable:

- (void)viewDidAppear:(BOOL)animated 
{ 
[super viewDidAppear:animated]; 
visible = YES; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
visible = NO; 
[super viewWillDisappear:animated]; 
} 
+1

Además, no haga esto como una categoría. La redefinición de métodos en una categoría es una mala práctica. –

+1

Esto sería un desastre en una categoría porque no podrá definir ningún comportamiento específico de clase en viewDidAppear o ViewWillAppear. – jpswain

+0

Por supuesto, aún puede definir un comportamiento específico de clase. Puede anular los métodos y aún llamar al supermétodo. Aunque esta es una publicación anterior, veo que una categoría no sería útil porque necesitarías almacenar 'visible'. Lo editaré. –

-4

simplemente para la corrección, lo que me gustaría añadir en la forma de determinar si el controlador de vista es se muestra en una aplicación basada en pestañas:

+(BOOL) isSelectedViewController:(UIViewController *)someVC; 
{ 
    myAppDelegate *appD = [[UIApplication sharedApplication] delegate]; 
    UIViewController *selectedVC = [appD.TabBarController selectedViewController]; 

    return selectedVC == someVC; 
} 
+2

Sería mucho mejor usar (myViewController.tabBarController.selectedViewController == myViewController.navigationController), suponiendo que anida controles de navegación dentro del controlador de la barra de pestañas. – Johnus

+0

Supongo que si sabes que el subcontrolador es un controlador de navegación, pero a menudo no es el caso. –

Cuestiones relacionadas