2014-12-31 4 views

Antwort

45

die Klasse in Swift zu überprüfen, verwenden "is" (as explained under "checking Type" in the chapter called Type Casting in the Swift Programming Guide)

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

Die Variable 'self.window' existiert nicht – user83039

+0

@ user83039 Was ist' self' dann in diesem Fall? Wo setzt du den Code? self.window und rootViewController befinden sich in AppDelegate. Brauchen Sie mehr Informationen. – mc01

+0

Ich bin in einem View-Controller. – user83039

23

für swift3 Compiler Aktualisiert um einen Sitz zu werfen! 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 
     } 
    } 
+0

Kein so etwas wie self.window – user83039

+1

sind Sie in AppDelegate? Wenn nicht, können Sie Ihr AppDelegate erhalten und so etwas tun. –

+2

Ehrfürchtig, das hat für mich funktioniert. Nur anstelle von 'self.window' verwende' self.view.window' – Coltrane

2

Versuchen Sie, diese

if self is MyViewController {   

} 
+0

self ist nicht unbedingt was angezeigt wird, wenn ich eine Funktion aus einer anderen Klasse verwende ... – user83039

13

Sie können Ihre Ansicht-Controller leicht iterieren, wenn Sie einen Navigation-Controller verwenden. Und dann können Sie nach der bestimmten Instanz als suchen:

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

Ich habe kein Objekt, das aktuelle Fenster soll das Objekt sein. – user83039

+1

Verwenden Sie self.isKindOfClass dann –

+1

Selbst ist nicht unbedingt, was angezeigt wird, wenn ich diese Funktion aus einer anderen Klasse verwenden ... – user83039

8

Ich musste den aktuellen ViewController in AppDelegate finden. ich verwendet, um dieses

//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!!!") 
      } 
     } 
    } 
4

Um von Thapa Antwort zu gehen, müssen Sie die Viewcontroller Klasse werfen, 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 
0

Für Typen, die Sie is verwenden können, und wenn es Ihre eigene ist Viewcontroller Klasse dann müssen Sie verwenden isKindOfClass wie:

let vcOnTop = self.embeddedNav.viewControllers[self.embeddedNav.viewControllers.count-1] 
      if vcOnTop.isKindOfClass(VcShowDirections){ 
       return 
      } 
0

Swift 3 | Überprüfen Sie, ob ein View-Controller der Stamm in sich selbst ist.

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

Kontext: Ich brauche die Position einer Ansicht zu aktualisieren und eine Animation auslösen, wenn das Gerät gedreht wird. Ich möchte das nur machen, 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 Sie die obigen Zeilen in die Konsole aus sehen. Wenn MyViewController nicht aktiv ist, werden Sie sie nicht sehen. Wenn Sie neugierig sind, warum ich UIDeviceOrientationDidChange anstelle von .UIDeviceOrientationDidChange verwende, sehen Sie sich this answer an.

0
let viewControllers = navController?.viewControllers 
     for aViewController in viewControllers! { 

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

Swift 3

Nicht sicher euch, aber ich bin mit diesem eine harte Zeit. Ich habe etwas wie folgt 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 die erste Ansicht Controller meiner App. Aus irgendeinem Grund wollte es den Root View Controller behalten, egal was passiert. Also habe ich gerade eine globale String-Variable currentViewController gemacht und setze ihren Wert selbst in jedem viewDidLoad().Alles was ich brauchte war zu sagen welcher Bildschirm ich war & das funktioniert perfekt für mich.

Verwandte Themen