【发布时间】:2014-09-07 21:39:22
【问题描述】:
如何在 Swift 的视图中遍历所有 UIButtons?我想将所有标题设置为"",但我在 Swift 中的 for 循环出错了。
for btns in self.view as [UIButton] {
// set the title to ""
}
【问题讨论】:
如何在 Swift 的视图中遍历所有 UIButtons?我想将所有标题设置为"",但我在 Swift 中的 for 循环出错了。
for btns in self.view as [UIButton] {
// set the title to ""
}
【问题讨论】:
这段代码应该可以工作:
for view in self.view.subviews as [UIView] {
if let btn = view as? UIButton {
btn.setTitleForAllStates("")
}
}
您需要遍历 subViews 数组。
【讨论】:
针对 Swift 3 和 4 进行了缩短和更新
for case let button as UIButton in self.view.subviews {
button.setTitleForAllStates("")
}
【讨论】:
循环遍历子视图有效,但有时有点难看,并且还有其他问题。
如果您需要循环访问某些特定按钮,例如添加圆角半径或更改色调或背景颜色,您可以使用 IBOutlets 数组,然后对其进行循环。
var buttons = [SkipBtn, AllowBtn]
for button in buttons as! [UIButton] {
button.layer.cornerRadius = 5
}
【讨论】:
要为常见用例添加一些上下文,假设按钮位于滚动视图中,并且您想要突出显示点击的按钮并取消突出显示其他按钮。在这种情况下,您可以将所有按钮指向一个操作方法:
@objc private func buttonAction(_ button: UIButton) {
for case let b as UIButton in view.scrollView.subviews {
if b == button {
b.setTitleColor(UIColor.green, for: []) // highlight
} else {
b.setTitleColor(UIColor.black, for: []) // de-highlight
}
}
}
【讨论】:
这段代码似乎对于迭代视图中的任何对象都非常有用,只需将 UIButton 更改为任何其他子视图类型,例如 UIView 或 UIImageView 等。
let filteredSubviews = self.view.subviews.filter({
$0.isKindOfClass(UIButton)})
for view in filteredSubviews {
//Do something
}
【讨论】:
使用了一些提供的问题并创建了我自己的问题。当您想以编程方式设置各种UIButtons 的标题时,我相信这是最有效的(在我的情况下,我正在构建一个测验)
通过randomising我的数组列表,我只用一个for循环打印按钮标题索引处的项目
for view in self.viewForButtons.subviews{
if view.isKindOfClass(UIButton)
{
let button : UIButton = view as! UIButton
button.setTitle("item[i]", forState: .Normal)
}
}
【讨论】:
斯威夫特 4:
let subviewButtons = self.view.subviews.filter({$0.isKind(of: UIButton.self)})
for button in subviewButtons {
//do something
}
【讨论】:
如果您在self.view 中有UIView,那么您需要在搜索UIButton 时遍历子视图。使用公认的答案,我做了这个小功能:
斯威夫特 4 + :
func findButton(`in` view: UIView){
for view in view.subviews as [UIView] {
if let button = view as? UIButton {
// Do something with 'button'
}else{
// Loop through subview looking for buttons
findButton(in: view)
}
}
}
用法:
override func viewDidLoad() {
findButton(in: self.view)
}
希望这会有所帮助!
【讨论】:
如果您知道子视图只有按钮,那么这是 Swift 中的一种简短方法:
myView.subviews.map {
($0 as? UIButton)!.enabled = false
}
【讨论】: