2014-12-31 6 views

risposta

45

Per controllare la classe di Swift, utilizzare "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

La variabile 'self.window' non esiste – user83039

+0

@ user83039 Cosa significa' self' in questo caso? Dove stai mettendo il codice? self.window e rootViewController sono in AppDelegate. Hai bisogno di più informazioni. – mc01

+0

Sono all'interno di un controller di visualizzazione. – user83039

23

Aggiornato per il compilatore swift3 lanciare un attacco in giro! e ?

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

Non esiste una finestra self.window – user83039

+1

sei in AppDelegate? in caso contrario, puoi ottenere il tuo AppDelegate e fare qualcosa del genere. –

+2

Fantastico, questo ha funzionato per me. Proprio al posto di 'self.window' usa' self.view.window' – Coltrane

2

Prova questa

if self is MyViewController {   

} 
+0

self non è necessariamente ciò che viene mostrato se sto usando una funzione di un'altra classe ... – user83039

13

si può facilmente iterare i controller di vista, se si utilizza un controller di navigazione. E poi si può verificare l'istanza particolare come:

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

Non ho un oggetto, la finestra corrente dovrebbe essere l'oggetto. – user83039

+1

Usa self.isKindOfClass quindi –

+1

self non è necessariamente quello che viene mostrato se sto usando quella funzione da un'altra classe ... – user83039

8

ho dovuto trovare il viewController corrente in AppDelegate. Ho usato questo

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

di andare fuori della risposta di Thapa, è necessario lanciare alla classe viewcontroller prima di utilizzare ...

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

Per i tipi che è possibile utilizzare is e se è il proprio classe viewcontroller allora avete bisogno di utilizzare isKindOfClass come:

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

Swift 3 | Controlla se un controller di visualizzazione è la radice dal suo interno.

È possibile accedere a window da un controller di visualizzazione, è sufficiente utilizzare self.view.window.

Contesto: devo aggiornare la posizione di una vista e attivare un'animazione quando il dispositivo viene ruotato. Voglio solo farlo se il controller della vista è attivo.

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

Se si ruota il dispositivo mentre MyViewController è attivo, potrete vedere le linee di cui sopra stampano alla console. Se MyViewController non è attivo, non li vedrai.

Se sei curioso perché sto usando UIDeviceOrientationDidChange invece di .UIDeviceOrientationDidChange, guarda this answer.

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

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

Swift 3

Non sei sicuro di voi ragazzi, ma sto avendo un momento difficile con questo. Ho fatto qualcosa del genere:

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

Ho continuato a ricevere il controller di visualizzazione iniziale della mia app. Per qualche ragione voleva rimanere il controller di visualizzazione radice, non importa cosa. Quindi ho appena creato una variabile di tipo stringa globale currentViewController e impostato il suo valore in ogni viewDidLoad().Tutto quello di cui avevo bisogno era di dire su quale schermo ero su & questo funziona perfettamente per me.

Problemi correlati