web-dev-qa-db-fra.com

Comment obtenir le UIViewController actuellement affiché qui n'est pas dans AppDelegate?

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.

6
Pangu

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
    }
}
18
Markicevic

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

1
Paul Zabelin