我有一个设置屏幕,它是一个 UITableViewController,包含大约 20 个静态(!)单元格(4 组,每组 5 个单元格)。每个静态单元格都包含一个标签。
有没有一种方法可以设置所有标签的文本颜色,而无需为每个标签创建出口并单独设置其文本颜色?
还有另一种方法可以做到这一点。这保证您可以访问单元格视图层次结构中的所有标签,无论它们处于哪个级别:
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
recursiveSetTextColorForLabelsInView(cell)
}
func recursiveSetTextColorForLabelsInView(inView: UIView) {
for view in inView.subviews {
if let subview = view as? UILabel {
subview.textColor = UIColor.redColor()
}
else {
self.recursiveSetTextColorForLabelsInView(view)
}
}
}
或者实现
-tableView:cellForRowAtIndexPath:
,只是不要调用 dequeueReusableCellWithIdentifier:
,因为这在静态 tableView 单元格上不起作用。请致电 super.cellForRowAtIndexPath:
。
然后您可以通过
cell.textLabel
访问标签,或者如果自定义单元格:cell.contentView.subviews.first as? UILabel
我建议对 UILabel 进行子类化,并在子类中设置文本颜色。在布局中,将 UILabels 的类更改为您的子类。作为奖励,将其设置为 IBDesignable,这样您就可以在故事板中看到您的自定义内容。
import UIKit
@IBDesignable
class CustomLabel: UILabel {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
customize()
}
override init(frame: CGRect) {
super.init(frame: frame)
}
override func prepareForInterfaceBuilder() {
customize()
}
private func customize() {
textColor = UIColor.redColor()
}
}
我是这样做的:
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
let view = cell.contentView.subviews.first
if let viewToTest = view as? UILabel
{
viewToTest.textColor = UIColor.redColor()
}
}
实际上,在我的例子中,单元格中的标签和其他控件位于 UIStackView 中,因此要访问我使用的标签视图:
let view = cell.contentView.subviews.first?.subviews.first
而不是:
let view = cell.contentView.subviews.first
因为在这种情况下,我的标签在单元格中再上一层。
就我而言,我想根据开关是否打开或关闭来更改整个部分的 Alpha 和 userInteraction。来自 https://stackoverflow.com/a/36097181/14414215 和 https://stackoverflow.com/a/36100831/14414215 的答案有助于引导此功能的正确方向。
func updateCellAlpha() {
let section = 1
let numberOfRows = self.tableView.numberOfRows(inSection: section)
for row in 0..<numberOfRows {
if let cell = self.tableView.cellForRow(at: IndexPath(row: row, section: section)) {
for subview in cell.contentView.subviews {
subview.alpha = syncToSwitch.isOn ? 1.0 : 0.5
subview.isUserInteractionEnabled = syncToSwitch.isOn ? true : false
}
}
}
}