在 Swift 中遍历视图控制器层次结构

2024-03-08

我想遍历 Swift 中的视图控制器层次结构并找到一个特定的类。这是代码:

extension UIViewController{

    func traverseAndFindClass<T : UIViewController>() -> UIViewController?{

        var parentController = self.parentViewController as? T?
                                    ^
                                    |
                                    |
        // Error: Could not find a user-defined conversion from type 'UIViewController?' to type 'UIViewController'
        while(parentController != nil){

            parentController = parentController!.parentViewController

        }

        return parentController

    }

}

现在,我知道 ParentViewController 属性返回一个可选的 UIViewController,但我不知道如何以上帝的名义使 Generic 成为可选类型。也许使用某种 where 子句?


你的方法应该返回T?代替UIViewController?,这样泛型类型 可以从上下文中推断出来。检查想要的班级还必须 在循环内部完成,而不仅仅是在循环之前完成一次。

这应该有效:

extension UIViewController {
    
    func traverseAndFindClass<T : UIViewController>() -> T? {
        
        var currentVC = self
        while let parentVC = currentVC.parentViewController {
            if let result = parentVC as? T {
                return result
            }
            currentVC = parentVC
        }
        return nil
    }
}

用法示例:

if let vc = self.traverseAndFindClass() as SpecialViewController? {
    // ....
}

Update:上面的方法没有按预期工作(至少在 Debug 中没有) 配置),我已经发布了问题 作为一个单独的问题:如果不应该的话,可选绑定会成功 https://stackoverflow.com/questions/25838032/optional-binding-succeeds-if-it-shouldnt。一种可能的解决方法(来自该问题的答案) 似乎是要替换

if let result = parentVC as? T { ...

with

if let result = parentVC as Any as? T { ...

或者删除方法定义中的类型约束:

func traverseAndFindClass<T>() -> T? {

更新2:该问题已在 Xcode 7 中得到修复,traverseAndFindClass()方法现在可以正常工作了。


斯威夫特 4 更新:

extension UIViewController {
    
    func traverseAndFindClass<T : UIViewController>() -> T? {
        var currentVC = self
        while let parentVC = currentVC.parent {
            if let result = parentVC as? T {
                return result
            }
            currentVC = parentVC
        }
        return nil
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Swift 中遍历视图控制器层次结构 的相关文章

随机推荐