swift - 在嵌套容器中查找后代按钮
问题描述
我在多个嵌套的 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 中
解决方案
我没有测试它,但使用递归你应该能够做到这一点。这样的事情可能对你有用:
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)
})
例如,根据找到按钮的顺序设置按钮标题。
推荐阅读
- linux - cairo 绘制线条和文本,然后显示 PNG 文件,这样旧对象就不会被擦除
- huawei-mobile-services - 提交设计资格时,仪表板中的华为主题错误
- api - GraphQl 变量问题 - 硬编码有效
- amazon-web-services - 在 AWS 中部署 ASP.NET Core Web API 的建议
- c - 为什么有时使用管道执行乒乓球程序会失败?
- spring-boot - 登录到 keycloak 后为 Spring Boot API 获取 401。但是如果用户没有登录到 keycloak,它就可以工作
- java - 无法启动多个 idempeire swing 客户端
- python - 在 Keras 中切片张量时的问题
- angular - 使用 gapi (typescript) 发送电子邮件在“已发送”框中显示错误编码的电子邮件
- loops - 在一个循环中遍历两个数组?