繁体   English   中英

从 uinavigationcontroller 中查找 uiviewcontroller

[英]Find a uiviewcontroller from uinavigationcontroller

我试图找出一种通用方法来找到自动类型转换的 uiviewcontroller。 目前,我确实有这个。

extension UINavigationController {

    func contoller(ofType type:AnyClass) -> UIViewController? {
        for controller in self.viewControllers {
            if controller.isKind(of: type) {
                return controller
            }
        }
        return nil
    }
}

调用将像:

if let controller = self.navigationController?.contoller(ofType: MyController.self) as? MyController{}

这就是我能够获得 controller object 的方式,我还需要输入 cast 。 我试图找出一种方法来做到这一点,如:

if let controller:MyController = self.navigationController?.contoller(ofType: MyController.self){}

这样我就不需要进行任何类型转换。

为此,我可能需要对 UINavigationController 扩展 function 进行一些更改。 需要一些建议。

使用 Generics:

extension UINavigationController {
    func controller<T: UIViewController>(ofType _: T.Type) -> UIViewController? {
        for controller in viewControllers where controller is T {
            return controller
        }
        return nil
    }
}

编辑 1:我也会将 VC 作为我们要求的类型返回。

并建议在名称中使用 first,因为可能不止一个。 并且您可能希望在将来引入 lastController(as:)

extension UINavigationController {
    func firstController<T: UIViewController>(as _: T.Type) -> T? {
        for case let controller as T in viewControllers {
            return controller
        }
        return nil
    }
}

那么用法可能是:

let nav = UINavigationController()
nav.viewControllers = [UIViewController(), UITabBarController()]
let tabVC = nav.firstController(as: UITabBarController.self)

编辑 2:您可以缩短扩展体:

extension UINavigationController {
    func firstController<T: UIViewController>(as _: T.Type) -> T? {
        viewControllers.first(where: { $0 is T }) as? T
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM