J'essaie d'obtenir l'affichage UIViewController
actuel qui ne figure pas dans AppDelegate, mais il semble toujours obtenir le premier UIViewController
initial, et non l'actuel.
Le code suivant dans AppDelegate a la présence de la variable UIViewController
actuelle, mais cette même fonction ne fonctionne pas lorsque je l'utilise dans l'un de mes contrôleurs de vue:
func getTopViewController() -> UIViewController
{
var topViewController = UIApplication.sharedApplication().delegate!.window!!.rootViewController!
while (topViewController.presentedViewController != nil) {
topViewController = topViewController.presentedViewController!
}
return topViewController
}
Le code ci-dessus a été fourni comme réponse à une question similaire: Récupère le UIViewController actuellement affiché à l'écran dans AppDelegate.m
Peu importe la profondeur à laquelle je me lise, je ne peux que récupérer le premier contrôleur de vue.
Comment puis-je obtenir la présentation actuelle UIViewController
?
FYI: Je n'utilise PAS avec un UINavigationController
, juste des classes UIViewController
ordinaires.
Je n'aime pas utiliser cela, mais c'est parfois nécessaire.
static func getTopViewController() -> UIViewController {
var viewController = UIViewController()
if let vc = UIApplication.shared.delegate?.window??.rootViewController {
viewController = vc
var presented = vc
while let top = presented.presentedViewController {
presented = top
viewController = top
}
}
return viewController
}
**MODIFIER:
Voici une version améliorée, elle obtiendra toujours le meilleur contrôleur de vue
static var top: UIViewController? {
get {
return topViewController()
}
}
static var root: UIViewController? {
get {
return UIApplication.shared.delegate?.window??.rootViewController
}
}
static func topViewController(from viewController: UIViewController? = UIViewController.root) -> UIViewController? {
if let tabBarViewController = viewController as? UITabBarController {
return topViewController(from: tabBarViewController.selectedViewController)
} else if let navigationController = viewController as? UINavigationController {
return topViewController(from: navigationController.visibleViewController)
} else if let presentedViewController = viewController?.presentedViewController {
return topViewController(from: presentedViewController)
} else {
return viewController
}
}
Voici la même idée dans une fonction:
func topController(_ parent:UIViewController? = nil) -> UIViewController {
if let vc = parent {
if let tab = vc as? UITabBarController, let selected = tab.selectedViewController {
return topController(selected)
} else if let nav = vc as? UINavigationController, let top = nav.topViewController {
return topController(top)
} else if let presented = vc.presentedViewController {
return topController(presented)
} else {
return vc
}
} else {
return topController(UIApplication.shared.keyWindow!.rootViewController!)
}
}
travaille pour moi dans le projet Swift 4