web-dev-qa-db-fra.com

Comment vérifiez-vous la classe de contrôleur de vue actuelle dans Swift?

Autant que je sache, cela fonctionnerait en Objective-C:

self.window.rootViewController.class == myViewController

Comment puis-je vérifier si le contrôleur de vue actuel est spécifique?

51
user83039

Pour vérifier la classe dans Swift, utilisez "est" (comme expliqué dans "Contrôle du type" dans le chapitre intitulé Transtypage dans le guide de programmation Swift)

if self.window.rootViewController is MyViewController {
    //do something if it's an instance of that class
}
65
mc01

Mise à jour pour le compilateur Swift3 qui tente de résoudre le problème! et ? 

if let wd = UIApplication.shared.delegate?.window {
        var vc = wd!.rootViewController
        if(vc is UINavigationController){
            vc = (vc as! UINavigationController).visibleViewController

        }

        if(vc is LogInViewController){
            //your code
        }
    }
35
Nhut Duong

Vous pouvez facilement parcourir vos contrôleurs de vue si vous utilisez un contrôleur de navigation. Et ensuite, vous pouvez vérifier l'instance particulière en tant que: 

if let viewControllers = navigationController?.viewControllers {
    for viewController in viewControllers {
        // some process
        if viewController.isKindOfClass(MenuViewController) {
            println("yes it is")
        }
    } 
}
17
Kiran Thapa

Je devais trouver le viewController actuel dans AppDelegate . J'ai utilisé cette

//at top of class
var window:UIWindow?

// inside my method/function
if let viewControllers = window?.rootViewController?.childViewControllers {
    for viewController in viewControllers {
        if viewController.isKindOfClass(MyViewControllerClass) {
            println("Found it!!!")
            }
        }
    }
10
Ivan Reyes

Pour sortir de la réponse de Thapa, vous devez utiliser la classe viewcontroller avant d'utiliser ...

   if let wd = self.view.window {
        var vc = wd.rootViewController!
        if(vc is UINavigationController){
            vc = (vc as! UINavigationController).visibleViewController
        }
        if(vc is customViewController){
            var viewController : customViewController = vc as! customViewController
7
KorinW

Essaye ça

if self is MyViewController {        

}
6

Swift 3

Je ne sais pas pour vous, mais je vais avoir du mal avec celui-ci. J'ai fait quelque chose comme ça:

if let window = UIApplication.shared.delegate?.window {
    if var viewController = window?.rootViewController {
        // handle navigation controllers
        if(viewController is UINavigationController){
            viewController = (viewController as! UINavigationController).visibleViewController!
        }
        print(viewController)
    }
}

Je n'arrêtais pas d'obtenir le contrôleur de vue initial de mon application. Pour une raison quelconque, il souhaitait rester le contrôleur de vue racine, quoi qu'il arrive. Je viens donc de créer une variable de type chaîne globale currentViewController et de définir moi-même sa valeur dans chaque viewDidLoad(). Tout ce dont j'avais besoin était de dire sur quel écran j'étais et cela fonctionnait parfaitement pour moi.

5
Trev14
let viewControllers = navController?.viewControllers
        for aViewController in viewControllers! {

            if aViewController .isKind(of: (MyClass?.classForCoder)!) {
                _ = navController?.popToViewController(aViewController, animated: true)
            }
        }
1
Hemanshu Liya

Swift 3 | Vérifiez si un contrôleur de vue est la racine à partir de lui-même.

Vous pouvez accéder à window à partir d'un contrôleur de vue, il vous suffit d'utiliser self.view.window.

Contexte: Je dois mettre à jour la position d'une vue et déclencher une animation lors de la rotation du périphérique. Je veux seulement faire ceci si le contrôleur de vue est actif.

class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(
            self, 
            selector: #selector(deviceDidRotate), 
            name: .UIApplicationDidChangeStatusBarOrientation, 
            object: nil
        )
    }

    func deviceDidRotate() {
        guard let window = self.view.window else { return }

        // check if self is root view controller
        if window.rootViewController == self {
            print("vc is self")
        }

        // check if root view controller is instance of MyViewController
        if window.rootViewController is MyViewController {
            print("vc is MyViewController")
        }
    }
}

Si vous faites pivoter votre appareil alors que MyViewController est actif, les lignes ci-dessus s'afficheront sur la console. Si MyViewController n'est pas actif, vous ne les verrez pas.

Si vous êtes curieux de savoir pourquoi j'utilise UIDeviceOrientationDidChange au lieu de .UIDeviceOrientationDidChange, regardez cette réponse .

1
Derek Soike

Pour les types, vous pouvez utiliser is et s'il s'agit de votre propre classe viewcontroller, vous devez utiliser isKindOfClass comme:

let vcOnTop = self.embeddedNav.viewControllers[self.embeddedNav.viewControllers.count-1]
            if vcOnTop.isKindOfClass(VcShowDirections){
                return
            }
1
Owais Munawar
if let index = self.navigationController?.viewControllers.index(where: { $0 is MyViewController }) {
            let vc = self.navigationController?.viewControllers[vcIndex] as! MyViewController
            self.navigationController?.popToViewController(vc, animated: true)
        } else {
            self.navigationController?.popToRootViewController(animated: true)
        }
0
Yuriy Ulantsev