【问题标题】:Correct way to grab the current navigation controller获取当前导航控制器的正确方法
【发布时间】:2019-01-08 12:53:50
【问题描述】:

鉴于我有 rootViewControllerUIApplication.shared.delegate?.window??.rootViewController,我想获取活动导航控制器(如果有)。

到目前为止,我想出了什么:

guard var controller = rootViewController?.presentedViewController else { return rootViewController as? UINavigationController }
while let presented = controller.presentedViewController {
    controller = presented
}
controller = controller.navigationController ?? controller
return controller as? UINavigationController

这就足够了吗?一个合作给了我这个解决方案,但我不明白的部分是rootViewController?.presentedViewController。不应该是rootViewController?.presentingViewController吗?

【问题讨论】:

  • 建议检查here的答案,抓住顶部的viewController然后得到它的navigationController
  • 你可以使用 self.navigationController 来获取当前活动的 navigationController

标签: ios swift


【解决方案1】:

使用下面的扩展来获取最顶部或当前可见的UIViewControllerUINavigationController

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

如何使用?

let objViewcontroller = UIApplication.topViewController()

let objNavigationController = UIApplication.topNavigation()

【讨论】:

  • 不,1)我不想要扩展,也没有要求 2)我不想要递归解决方案,3)你错过了整个问题。如果您阅读我的帖子,我会问两件事:1)我的解决方案是否足够,2)为什么我应该使用 presentedViewController 而不是 presentingViewController。如果您想更新您的答案以反映这一点并且有效,那么我会接受。
【解决方案2】:

这就够了吗?

只有你自己知道。它在您的情况下是否可靠地工作?如果是,它可能足以满足您的需求。但这不是普遍正确的答案。

正如@vivekDas 在评论中提到的那样,更可靠的方法是使用navigationController 方法,该方法返回图中最近的视图控制器,即导航控制器。

...我不明白的部分是rootViewController?.presentedViewController。不应该是rootViewController?.presentingViewController吗?

没有。假设你有两个视图控制器,aba 呈现 b。在这种情况下,a.presentedViewControllerbb.presentingViewControllera。所以rootViewController.presentedViewControllerrootViewController 呈现的视图控制器。 rootViewController.presentingViewController 将是提供rootViewController 的控制器。但是rootViewController 是视图控制器对象图的根;根据定义,它没有被任何其他视图控制器呈现,所以rootViewController.presentingViewController 将永远为零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 2013-07-28
    相关资源
    最近更新 更多