我的设置如下:
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/