ios - 在 UIView 中循环遍历 UIButtons

标签 ios swift loops

我的设置如下:

UIView(1) -> UIScrollview -> UIStackview -> UIViews(2) -> UIButton

如何循环遍历 UIStackview 中所有 UIViews(2) 中的每个 UIButton?我的 UIView(1) 中有更多按钮,因此我无法遍历整个 Viewcontroller 中的每个按钮。我试过:

for view in self.stackview.subviews as [UIView] {
    if let btn = view as? UIButton {
        print("Worked")
    }
}
for view in self.scrollview.subviews as [UIView] {
    if let btn = view as? UIButton {
        print("Worked")
    }
}
for case let button as UIButton in self.scrollview.subviews {
    print("worked")
}
for case let button as UIButton in self.stackview.subviews {
    print("worked")
}

尝试将其添加到我的 viewDidLoad 函数时,它只是不打印任何内容。我在这里做错了什么?

最佳答案

想到的第一个解决方案:

let buttons = self.stackview.subviews // direct subviews of stack view
    .map { subview in subview.subviews } // second level subviews
    .joined() // join the second level subviews into one flat array
    .compactMap { $0 as? UIButton } // filter buttons

基本上你只是忘记跳到第二层。您仅迭代第一级 subview 。

如果你想要一个更稳定的解决方案,你可以递归迭代任何深度的 subview ,例如使用类别:

extension UIView {
    var allSubviews: [UIView] {
        return self.subviews + self.subviews.map { $0.allSubviews }.joined()
    }
}

然后

let buttons = self.stackview.allSubviews.compactMap { $0 as? UIButton }

关于ios - 在 UIView 中循环遍历 UIButtons,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42629306/

相关文章:

ios - 从url下载文件并保存到iPhone上的资源

swift - 如何让 uicollectionview 在从 firebase 接收到数据后重新加载?

UITableView 滚动时 iOS 应用程序崩溃

iphone - 在视网膜显示器上使用实际像素绘图

ios - 单元格中选定的按钮显示在重用单元格上 - 还使用 sender.tag 进行按钮区分

ios - 如何在 Swift 3 的字符串文字中表示特殊字符

javascript - 在 react 中渲染嵌套的对象数组

python - 尝试迭代数据框中的两列时出现错误 :-too many values to unpack (expected 2),

PYTHON 3.8 日期范围

ios - 我已停止 captureSession 但扫描仪仍在工作。如何解决这个错误?