2010-09-09 4 views
46

Possible en double:
How to tell if UIViewController's view is visibleComment vérifier si la vue d'un UIViewController spécifique est actuellement visible?

Je développe une application qui traite un flux constant de données entrantes provenant du réseau et fournit un certain nombre de UIViews pour l'utilisateur de visualiser que Les données. Lorsque certaines données de modèle sont mises à jour en fonction du flux entrant provenant du réseau, j'accède au UIViewController ou UITableViewController associé et à -setNeedsDisplay (dans le cas de UIViewController) ou -reloadData (dans le cas de UITableViewController).

Existe-t-il un moyen de vérifier si un UIView est actuellement affiché (au-delà du simple chargement) afin que je ne fasse que -setNeedsDisplay ou -reloadData si l'utilisateur regarde actuellement ce UIView? Il semblerait qu'appeler -setNeedsDisplay ou reloadData sur une vue que l'utilisateur ne regarde pas actuellement est une perte de puissance de traitement et ne serait pas bon pour la vie de la batterie. Lorsque l'utilisateur bascule finalement sur une vue précédemment mise à jour, faire -setNeedsDisplay ou reloadData sur -viewWillAppear aurait plus de sens.

Merci

+0

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

+0

Je ne peux pas ajouter une autre réponse, mais il y a maintenant une propriété appelé isVisible sur les contrôleurs de vue –

Répondre

132

Après avoir fait quelques recherches, j'ai trouvé cette réponse dans une autre question affichée ici ... Cela semble être la meilleure façon ...

Le la propriété de la fenêtre de vue est non nul si une vue est actuellement visible, afin de vérifier la vue principale dans le contrôleur de vue:

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

Je viens de modifier [l'autre question] (http://stackoverflow.com/questions/2777438/how-to-tell-if-uiviewcontrollers-view-is-visible/2777460#2777460) pour également vérifier isViewLoaded d'abord pour éviter accidentellement chargement de la vue que fera ce code ci-dessus. Faites le test: 'if (viewController.isViewLoaded && viewController.view.window) ...' – progrmr

+1

Cette réponse ne devrait pas vraiment être marquée comme correcte, car elle déclenchera le chargement de la vue du VC. Voir la réponse du programmeur ci-dessus. –

+2

Cela vous donnera des faux positifs pour les viewControllers qui sont obstrués par d'autres viewControllers modalement affichés -> pas la bonne façon.Qu'est-ce que cela fait est une vérification fiable d'un viewController n'est pas visible, mais pas l'inverse. – Till

12

Ajouter à votre contrôleur, ou à une sous-classe de UIViewController que vous pouvez ensuite sous-classe plus loin. L'accès à l'aide d'une propriété ou la variable:

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

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

De même, ne le faites pas en tant que catégorie. Redéfinir les méthodes dans une catégorie est une mauvaise pratique. –

+1

Ce serait un désastre dans une catégorie car vous ne pourrez pas définir de comportement spécifique à la classe sur viewDidAppear ou ViewWillAppear. – jpswain

+0

Bien sûr, vous pouvez toujours définir un comportement spécifique à la classe. Vous pouvez remplacer les méthodes et toujours appeler la super méthode. C'est un ancien article, et je vois qu'une catégorie ne serait pas utile parce que vous auriez besoin de stocker 'visible'. Je vais l'éditer. –

-4

Juste pour être complet, je pensais que j'ajouter dans la façon de déterminer si le contrôleur de vue est étant affiché dans une application basée sur un onglet:

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

    return selectedVC == someVC; 
} 
+2

Il serait beaucoup plus agréable d'utiliser (myViewController.tabBarController.selectedViewController == myViewController.navigationController), en supposant que vous imbriquiez les contrôleurs de navigation dans le contrôleur de la barre d'onglets. – Johnus

+0

Je suppose que si vous savez que le sous-contrôleur est un contrôleur de navigation, mais ce n'est souvent pas le cas. –

Questions connexes