webentwicklung-frage-antwort-db.com.de

Wie prüft man die aktuelle View-Controller-Klasse in Swift?

Soweit ich weiß, würde dies in Objective-C funktionieren:

self.window.rootViewController.class == myViewController

Wie kann ich überprüfen, ob der aktuelle View Controller ein bestimmter ist?

51
user83039

Um die Klasse in Swift zu überprüfen, verwenden Sie "ist" (wie unter "Typ prüfen" im Kapitel "Typumwandlung" im Swift-Programmierhandbuch beschrieben)

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

Aktualisiert für den Swift3-Compiler, der herumzieht! und ? 

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

Sie können Ihre View-Controller problemlos durchlaufen, wenn Sie einen Navigations-Controller verwenden. Und dann können Sie nach der jeweiligen Instanz suchen: 

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

Ich musste den aktuellen viewController in AppDelegate finden, den ich verwendet habe

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

Um die Antwort von Thapa zu umgehen, müssen Sie in die Viewcontroller-Klasse wechseln, bevor Sie ...

   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

Versuche dies

if self is MyViewController {        

}

Swift 3

Ich bin mir nicht sicher, was euch angeht, aber es fällt mir schwer. Ich habe so etwas gemacht:

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)
    }
}

Ich bekam immer den ersten View-Controller meiner App. Aus irgendeinem Grund wollte es der Root-View-Controller bleiben, egal was. Also habe ich einfach eine globale Stringvariable currentViewController erstellt und ihren Wert in jeder viewDidLoad() selbst festgelegt. Alles was ich brauchte, war zu sagen, auf welchem ​​Bildschirm ich war und das funktioniert perfekt für mich.

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 | Prüfen Sie, ob ein View-Controller das Stammverzeichnis von sich aus ist.

Sie können innerhalb eines View-Controllers auf window zugreifen. Sie müssen lediglich self.view.window verwenden.

Kontext: Ich muss die Position einer Ansicht aktualisieren und eine Animation auslösen, wenn das Gerät gedreht wird. Ich möchte dies nur tun, wenn der View Controller aktiv ist.

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")
        }
    }
}

Wenn Sie Ihr Gerät drehen, während MyViewController aktiv ist, werden die obigen Zeilen auf der Konsole gedruckt. Wenn MyViewController nicht aktiv ist, werden Sie nicht angezeigt.

Wenn Sie neugierig sind, warum ich UIDeviceOrientationDidChange anstelle von .UIDeviceOrientationDidChange verwende, dann sehen Sie diese Antwort .

1
Derek Soike

Für Typen können Sie is verwenden. Wenn es sich um Ihre eigene Viewcontroller-Klasse handelt, müssen Sie isKindOfClass wie folgt verwenden:

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