Question Comment savoir si la vue de UIViewController est visible


J'ai une application tabbar, avec de nombreuses vues. Y a-t-il un moyen de savoir si un UIViewController particulier est actuellement visible depuis UIViewController? (à la recherche d'une propriété)


472
2018-05-05 23:25


origine


Réponses:


Les vues propriété de fenêtre est non nul si une vue est actuellement visible, vérifiez donc la vue principale dans le contrôleur de vue:

[MODIFIER] Invoquer le vue la méthode provoque le chargement de la vue (si elle n'est pas chargée), ce qui est inutile et peut être indésirable. Il vaudrait mieux vérifier d'abord s'il est déjà chargé. J'ai ajouté l'appel à isViewLoaded pour éviter ce problème.


930
2018-05-05 23:35



Ici la solution @ progrmr en tant que UIViewController Catégorie:

// 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

84
2018-06-30 03:58



Il y a quelques problèmes avec les solutions ci-dessus. Si vous utilisez, par exemple, un UISplitViewController, la vue principale sera toujours vraie pour

if(viewController.isViewLoaded && viewController.view.window) {
    //Always true for master view in split view controller
}

Au lieu de cela, adoptez cette approche simple qui semble bien fonctionner dans la plupart des cas, sinon tous:

- (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;
}

39
2018-02-04 14:37



Pour ceux d'entre vous à la recherche d'un Swift 2.2 version de la réponse:

if self.isViewLoaded() && (self.view.window != nil) {
     // viewController is visible
}

et Swift 3:

if self.isViewLoaded && (self.view.window != nil) {
         // viewController is visible
}

37
2018-04-04 15:03



Vous voulez utiliser le UITabBarControllerde selectedViewController propriété. Tous les contrôleurs de vue attachés à un contrôleur de barre d'onglets ont un tabBarController ensemble de propriétés, vous pouvez donc, depuis n'importe quel code des contrôleurs de vue:

if([[[self tabBarController] selectedViewController] isEqual:self]){
     //we're in the active controller
}else{
     //we are not
}

25
2018-05-05 23:36



Pour une présentation modale en mode plein écran ou over-context, "visible" peut signifier qu'il se trouve au-dessus de la pile du contrôleur de vue ou simplement visible mais couvert par un autre contrôleur de vue.

Pour vérifier si le contrôleur de vue "est le contrôleur de vue du dessus" est très différent de "est visible", vous devez vérifier la pile de contrôleurs de vue du contrôleur de navigation du contrôleur de vue.

J'ai écrit un morceau de code pour résoudre ce problème:

extension UIViewController {
    public var isVisible: Bool {
        if isViewLoaded {
            return view.window != nil
        }
        return false
    }

    public var isTopViewController: Bool {
        if self.navigationController != nil {
            return self.navigationController?.visibleViewController === self
        } else if self.tabBarController != nil {
            return self.tabBarController?.selectedViewController == self && self.presentedViewController == nil
        } else {
            return self.presentedViewController == nil && self.isVisible
        }
    }
}

20
2017-12-11 05:13



J'ai fait une extension rapide basée sur la réponse de @ progrmr.

Il vous permet de vérifier facilement si un UIViewController est à l'écran comme ça:

if someViewController.isOnScreen {
    // Do stuff here
}

L'extension:

//
//  UIViewControllerExtension.swift
//

import UIKit

extension UIViewController{
    var isOnScreen: Bool{
        return self.isViewLoaded() && view.window != nil
    }
}

12
2018-05-20 08:36



Pour mes besoins, dans le contexte d'un contrôleur de vue conteneur, j'ai trouvé que

- (BOOL)isVisible {
    return (self.isViewLoaded && self.view.window && self.parentViewController != nil);
}

fonctionne bien.


7
2018-06-18 15:27



Si vous utilisez un UINavigationController et souhaitez également gérer les vues modales, voici ce que j'utilise:

#import <objc/runtime.h>

UIViewController* topMostController = self.navigationController.visibleViewController;
if([[NSString stringWithFormat:@"%s", class_getName([topMostController class])] isEqualToString:@"NAME_OF_CONTROLLER_YOURE_CHECKING_IN"]) {
    //is topmost visible view controller
}

3
2017-10-05 23:38