webentwicklung-frage-antwort-db.com.de

Wie bekomme ich den aktuell angezeigten UIViewController nicht in AppDelegate?

Ich versuche, die aktuell angezeigte UIViewController abzurufen, die sich nicht in AppDelegate befindet, aber es scheint immer die erste oberste UIViewController und nicht die aktuelle zu sein.

Der folgende Code in AppDelegate erhält zwar die aktuelle UIViewController, diese Funktion funktioniert jedoch nicht, wenn ich sie in einem meiner View-Controller verwende:

func getTopViewController() -> UIViewController
{
    var topViewController = UIApplication.sharedApplication().delegate!.window!!.rootViewController!
    while (topViewController.presentedViewController != nil) {
        topViewController = topViewController.presentedViewController!
    }
    return topViewController
}

Der obige Code wurde als Antwort auf eine ähnliche Frage bereitgestellt: Ruft den aktuell angezeigten UIViewController auf dem Bildschirm in AppDelegate.m ab

Egal wie tief ich segle, ich kann nur den ersten View-Controller abrufen.

Wie bekomme ich die aktuelle Präsentation UIViewController?

Zu Ihrer Information: Ich bin NICHT und verwende eine UINavigationController, nur reguläre UIViewController-Klassen.

6
Pangu

Ich mag das nicht, aber manchmal ist es notwendig. 

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
}

**BEARBEITEN:

Hier ist eine verbesserte Version, sie wird immer die meisten View-Controller erhalten

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

Hier ist die gleiche Idee in einer Funktion:

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

arbeitet für mich in Swift 4 Projekt

1
Paul Zabelin