如何从单独的视图控制器调用popToRootViewController()函数?

时间:2017-08-21 00:47:21

标签: ios swift uinavigationcontroller

这是将用户弹回到UINavigationController中的根目录的函数:

func popToRoot() {
    navigationController?.popToRootViewController(animated: true)
}

但是,我需要从标签栏调用此功能,这显然是一个完全不同的类和文件,甚至不在导航堆栈中。

func moveToTab3(sender: UIButton!) {
    if CurrentContentController != containerStack[3] {
        moveToTab(3, animated: false)
    } else {
        // since you are already in this tab, popToRoot function goes here, but how?
    }
}

问题是.navigationController?是非常特殊的,它似乎必须从它所驻留的对象内调用。这是怎么做到的?

1 个答案:

答案 0 :(得分:0)

我不确定我是否正确,但是为了能够从当前控制器导航到根目录,您可以使用以下方法检测应用程序中的顶级控制器:

extension UIApplication {
    class func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        if let navigationController = controller as? UINavigationController {
            return topViewController(controller: navigationController.visibleViewController)
        }
        if let tabController = controller as? UITabBarController {
            if let selected = tabController.selectedViewController {
                return topViewController(controller: selected)
            }
        }
        if let presented = controller?.presentedViewController {
            return topViewController(controller: presented)
        }
        return controller
    }
}

然后您可以访问该顶级控制器并调用popToRoot:

if let topController = UIApplication.topViewController() {
        // navigate to the root
               topController.navigationController?.popToRootViewController(animated: true)
}

它应该工作。如果您需要更多信息,请告诉我们