10

Come si verifica se un UIViewController viene attualmente visualizzato?Come posso verificare se un UIViewController è attualmente visualizzato?

Il mio UIViewControllers sta ascoltando per NSNotifications - anche se quando non vengono visualizzati (cioè non mostrato). Quindi potrei avere 10 UIViewController sullo sfondo osservando NSNotifications da NSNotificationCenter. Quando uno NSNotification viene pubblicato e ricevuto dallo UIViewController, vorrei sapere se è attualmente mostrato. Se non lo è, imposterò semplicemente un valore booleano in modo che venga elaborato quando viene presentata la vista. Se attualmente viene visualizzato, eseguirò più operazioni come aggiornare le tabelle immediatamente e così via ...

+0

Come si presenta la vista del controller di visualizzazione? – tdubik

+0

@tdubik: il modo tradizionale, come pushViewController. Non sto usando StoryBoard o segues. – ikevin8me

+0

In tal caso è possibile controllare 'topViewController' dalla classe' UINavigationController'. O se vuoi elaborare più di un controller, enumeri l'array 'viewControllers'. – tdubik

risposta

13

è necessario controllare se il tuo viewcontroller è in cima alla pila di array viewcontroller di navigationcontroller. Un codice di esempio è,

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

È possibile utilizzare questo all'interno del metodo viewWillAppear per verificare se la vista corrente è visibile.

+1

@ La risposta di DBD è più generica e poiché il titolo della domanda non è specifico, sarà più utile per i futuri lettori. – Zedenem

1

Perché non rimuovi il listener di notifica in viewWillDisappear e lo aggiungi in viewWillAppear?

Modifica: letto male la sua domanda, mi dispiace.

Risposta suggerita: imposta il tuo flag (BOOL) in viewDidDisappear e viewDidAppear.

+0

Questo non funzionerà perché mancherà tutte le notifiche quando rimosse. – ikevin8me

+0

Quindi per quanto riguarda l'impostazione di un flag (BOOL) in viewWillDisappear per indicare che la vista non è più visibile. Quando riceve una notifica, controlla il flag per vedere se la vista è visibile. – yuf

+0

Se arriva la notifica, dovrò ricaricare la tabella. Se non viene, allora è troppo costoso farlo. Inoltre, non è necessario ricaricare la tabella quando la vista viene nuovamente visualizzata per lo stesso motivo: i dati sono gli stessi e troppo costosi. – ikevin8me

0

Penso che il controllo di viewController.view.superview dovrebbe funzionare.

+0

Non capisco davvero. Come si effettua il confronto? – ikevin8me

+0

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

+0

Il problema è che la tua vista potrebbe essere allegata a una superview, ma quella superview potrebbe non essere collegata alla tua finestra quindi c'è una potenziale scappatoia dove non funzionerà . – DBD

6

Verificare se è collegato alla finestra. Se non è nil è nella gerarchia che è attaccato allo schermo (ovviamente potrebbe essere fuori dai limiti dello schermo, coperta da qualche altro punto di vista o hanno il flag nascosto)

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

Chiudi, ma dovresti controllare se la vista è caricata prima di verificare se la vista è nella finestra: 'if (self.isViewLoaded && self.view.window! = Nil) ...' –

+0

@rob. Sì hai ragione. Se il controller della vista non è caricato e accedete all'oggetto 'view', causerete un caricamento lento che potrebbe significare caricare le cose in memoria che non siete veramente pronti per l'uso. Mentre darebbe comunque la risposta corretta, presenterebbe prestazioni meno che ideali. Avevo fatto l'ipotesi che le notifiche sarebbero state aggiunte solo quando la vista è stata caricata, non inizializzata, poiché una vista non inizializzata non sarà mai allegata. Eppure era forse un'ipotesi inadeguata e una che avrebbe dovuto essere dichiarata se non altro. – DBD

+0

Questa dovrebbe essere la risposta corretta, con la modifica di @ robmayoff integrata. – Bill

4

È possibile utilizzare i flag nei metodi viewWillAppear e viewWillDisappear per questo.

1

Specificare il titolo per ciascun ViewController e quindi ottenere il titolo di ViewController corrente in base al codice riportato sotto.

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. 

}