这是我在Swift中发布的Traverse视图控制器层次结构的可能解决方案(稍加修改):
extension UIViewController {
func traverseAndFindClass<T where T : UIViewController>(T.Type) -> T? {
var currentVC = self
while let parentVC = currentVC.parentViewController {
println("comparing \(parentVC) to \(T.description())")
if let result = parentVC as? T { // (XXX)
return result
}
currentVC = parentVC
}
return nil
}
}
Run Code Online (Sandbox Code Playgroud)
该方法应遍历父视图控制器层次结构并返回给定类的第一个实例,如果没有找到则返回nil.
但它不起作用,我无法弄清楚原因.标记为的可选绑定(XXX) 始终成功,因此即使第一个父视图控制器不是实例,也会返回第一个父视图控制器T.
这很容易重现:从Xcode 6 GM中的"iOS Master-Detail Application"模板创建项目,并viewDidLoad()在
MasterViewController类中添加以下代码:
if let vc = self.traverseAndFindClass(UICollectionViewController.self) {
println("found: \(vc)")
} else {
println("not …Run Code Online (Sandbox Code Playgroud)