我試圖找出一種通用方法來查找自動型別轉換的 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{}
這就是我能夠獲得控制器物件的方式,我也需要輸入它。我試圖找出一種方法來做到這一點,如:
if let controller:MyController = self.navigationController?.contoller(ofType: MyController.self){}
這樣我就不需要進行任何型別轉換。
為此,我可能需要對 UINavigationController 擴展功能進行一些更改。需要一些建議。
uj5u.com熱心網友回復:
使用泛型:
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
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/510461.html
標籤:IOS迅速苹果手机仿制药
