10

¿Cómo puedo verificar si actualmente se está visualizando un UIViewController?¿Cómo puedo verificar si actualmente se está visualizando un UIViewController?

Mi UIViewControllers está a la escucha de NSNotifications - incluso si no se muestran (es decir, no se muestran). Así que podría tener 10 UIViewController en el fondo observando NSNotifications desde NSNotificationCenter. Cuando NSNotification se publica y recibe por UIViewController, me gustaría saber si actualmente se está mostrando. Si no es así, simplemente estableceré un booleano para que se procese cuando se presente la Vista. Si actualmente se muestra, haré más cosas como actualizar tablas inmediatamente, etc. ...

+0

¿Cómo está presentando la vista del controlador de vista? – tdubik

+0

@tdubik: la forma tradicional, como pushViewController. No estoy usando StoryBoard o segues. – ikevin8me

+0

En tal caso, puede verificar 'topViewController' de la clase' UINavigationController'. O si desea procesar más de un controlador, enumere la matriz 'viewControllers'. – tdubik

Respuesta

13

Es necesario comprobar si su viewcontroller se encuentra en la parte superior de la matriz de viewcontroller de navigationcontroller. Un código de ejemplo es,

if (self.navigationController.topViewController == self) { 
    //the view is currently displayed 
} 

Puede utilizar este método dentro de la viewWillAppear para comprobar si la vista actual es visible.

+1

@ La respuesta de DBD es más genérica y dado que el título de la pregunta no es tan específico, será más útil para los lectores futuros. – Zedenem

1

¿Por qué no elimina el oyente de notificación en viewWillDisappear y lo agrega en viewWillAppear?

Editar: leyó mal su pregunta, lo siento.

Respuesta sugerida: configure su propia marca (BOOL) en viewDidDisappear y viewDidAppear.

+0

Esto no funcionará porque perderá todas las notificaciones cuando se eliminó. – ikevin8me

+0

Entonces, ¿qué pasa con la configuración de un indicador (BOOL) en viewWillDisappear para indicar que la vista ya no está visible? Cuando recibe una notificación, verifique la bandera para ver si la vista es visible. – yuf

+0

Si aparece la notificación, tendré que volver a cargar la tabla. Si no viene, entonces es demasiado costoso hacer eso. Además, no hay necesidad de volver a cargar la tabla cuando la vista vuelve a aparecer por la misma razón: los datos son los mismos y demasiado caros. – ikevin8me

0

Creo que la comprobación de viewController.view.superview debería funcionar.

+0

Realmente no entiendo. ¿Cómo haces la comparación? – ikevin8me

+0

'if (viewController.view.superview! = Nil)' – tdubik

+0

El problema es que su vista podría adjuntarse a una supervista, pero esa supervista podría no estar adjuntada a su ventana, por lo que existe una laguna potencial en la que no funcionará . – DBD

6

Comprueba si está conectado a la ventana. Si no es nil está en la jerarquía que se adjunta a la pantalla (por supuesto que podría estar fuera de los límites de la pantalla, cubierta por alguna otra vista o tienen establecido el indicador oculto)

if (myViewController.view.window) { 
    // I'm attached to the window 
} else { 
    // not attached to the window 
} 
+1

Cerrar, pero debe verificar si la vista está cargada antes de verificar si la vista está en la ventana: 'if (self.isViewLoaded && self.view.window! = Nil) ...' –

+0

@rob. Sí, estás en lo correcto. Si el controlador de vista no está cargado y accede al objeto 'view', ocasionará una carga lenta que podría significar cargar cosas en la memoria que realmente no está listo para usar. Si bien daría la respuesta correcta, presentaría un rendimiento inferior al ideal. Había asumido que las notificaciones solo se agregarían cuando la vista se cargue, no se inicialice, ya que nunca se adjuntará una vista no inicializada. Aún así, posiblemente fue una suposición inapropiada y una que debería haberse expresado, nada más. – DBD

+0

Esta debería ser la respuesta correcta, con el cambio de @ robmayoff integrado. – Bill

4

Puede usar indicadores en los métodos viewWillAppear y viewWillDisappear para esto.

1

Especifique el título de cada ViewController y luego obtenga el título de ViewController actual por el código que se proporciona a continuación.

NSString *currentController = self.navigationController.visibleViewController.title; 

Then check it by your title like this 

if([currentController isEqualToString:@"myViewControllerTitle"]){ 

    //write your code according to View controller. 

} 
Cuestiones relacionadas