gpt4 book ai didi

ios - 在 Swift 中遍历 View Controller 层次结构

转载 作者:可可西里 更新时间:2023-11-01 01:06:45 25 4
gpt4 key购买 nike

我想遍历 Swift 中的 View Controller 层次结构并找到一个特定的类。这是代码:

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?,这样通用类型可以从上下文推断。检查通缉类(class)也必须在循环内完成,而不仅仅是在循环之前完成一次。

这应该有效:

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? {
// ....
}

更新:上述方法没有按预期工作(至少在调试中没有配置),我已经发布了问题作为一个单独的问题:Optional binding succeeds if it shouldn't .一种可能的解决方法(来自对该问题的回答)好像是要替换

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

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

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

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

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


Swift 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
}
}

关于ios - 在 Swift 中遍历 View Controller 层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25828147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com