![](/img/trans.png)
[英]Unwind from UINavigationController to 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.