首页 > 解决方案 > 在嵌套容器中查找后代按钮

问题描述

我在多个嵌套的 StackViews 中放置了按钮

然后我将视图放在 CollectionView 中(是的,我认识到这不一定是最好的或最佳的方法)。

我试图弄清楚如何以编程方式找到我的所有按钮。

如果我这样做,我得到的只是我的 StackView 而不是按钮(现在是第 3 级后代)。我希望不必纠正嵌套循环,而是找到一个函数来帮助我找到 UIButton 类型的所有后代。

        for subview in buttonContainer.subviews {
            let button = subview as? UIButton
            if button != nil {
                button!.setTitle("TEST", for: UIControl.State.normal)
            }    
        }

我这样做的原因只是作为学习不同方法的练习,这就是为什么我可以嵌套多个堆栈视图然后将它们放在 CollectionView 中

标签: swift

解决方案


我没有测试它,但使用递归你应该能够做到这一点。这样的事情可能对你有用:

func findButtonsIn(_ view: UIView) -> [UIButton] {
    var buttons: [UIButton] = []
    view.subviews.forEach({
        if let button = $0 as? UIButton {
            buttons.append(button)
        } else {
            buttons.append(contentsOf: self.findButtonsIn($0))
        }
    })
    return buttons
}

用法

findButtonsIn(yourView)

该函数将返回所有找到UIButtons的数组。

你可以使用

self.findButtonsIn(UIView()).enumerated().forEach({
    $0.element.setTitle("\($0.offset)", for: .normal)
})

例如,根据找到按钮的顺序设置按钮标题。


推荐阅读