ios - 获取当前导航 Controller 的正确方法

标签 ios swift

鉴于我有 rootViewController,它是 UIApplication.shared.delegate?.window??.rootViewController,我想获取事件的导航 Controller ,如果有的话。

到目前为止我想出的是:

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 吗?

最佳答案

使用下面的扩展来获取最顶部或当前可见的 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()

关于ios - 获取当前导航 Controller 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51625024/

相关文章:

ios - 如何在带有部分的 TableView 上创建搜索栏?

swift - 如何防止Mac菜单栏应用失去焦点?

swift - 为什么我可以在 Swift 中将 NSNumber 的值设置为 true/false?

swift - 使用与原始尺寸不同的纹理为 SKSpriteNode 设置动画

ios - Swift Charts : . chartYScale 似乎只能以 100 为增量工作?

objective-c - 带有自定义后退导航按钮的自定义按钮栏

ios - 存储用户 token ,如果 token 无效 - 出现登录页面,

swift - 将 CMTime 转换为字符串是错误的值返回

ios - 在 Xcode 9.2 中看不到 XCUITest 的录制红色按钮

ios - avplayer 没有播放 URL