2016-03-19 2 views
2

Ich habe einen Bildschirm Einstellungen, die ein UITableViewController und enthält rund 20 statisch (!) Zellen (4 Gruppen, 5 Zellen in jeder Gruppe). Jede statische Zelle enthält ein Label.Set Textfarbe aller Etiketten in einer Tabellenansicht, die eine Reihe von statischen Zellen hat

Gibt es eine Möglichkeit, die Textfarbe aller Etiketten zu setzen, ohne einen Ausgang für jedes Etikett zu erstellen und seine Textfarbe einstellen individuell?

+0

Sie sind gruppierte statische Zellen? –

Antwort

0

Ich würde UILabel subclassing empfehlen und Ihre Textfarbe in der Unterklasse festlegen. Ändern Sie in Ihrem Layout die Klasse Ihrer UILabels in Ihre Unterklasse. Als Bonus machen Sie es IBDesignable, damit Ihre Anpassungen im Storyboard angezeigt werden.

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() 
    } 

} 

Xcode

+0

Danke. Es ist nicht schlecht, aber wäre ähnlich, jedem Label zuzuweisen und es in '-tableView: cellForRowAtIndexPath:' oder in '- tableView: willDisplayCell: forRowAtIndexPath:' sauberer und schneller zu setzen. – hkdalex

1

implementieren Alternativ -tableView:cellForRowAtIndexPath:, rufen einfach nicht dequeueReusableCellWithIdentifier: als dass nicht auf statische Zellen Tableview funktioniert. Rufen Sie stattdessen super.cellForRowAtIndexPath: an.

Dann können Sie das Etikett über cell.textLabel oder wenn benutzerdefinierte Zelle zugreifen: cell.contentView.subviews.first as? UILabel

+0

Danke, das scheint zu funktionieren, aber ich ging letztendlich auf eine andere Weise, indem ich über ' - tableView: willDisplayCell: forRowAtIndexPath:' auf das Label zugreife. Siehe meine eigene Antwort auf die Frage. – hkdalex

0

Hier ist, wie ich es tat:

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() 
    } 
} 

Eigentlich in meinem Fall das Etikett und andere Steuerelemente in einer Zelle sind in UIStackView, so den Zugriff auf die Etikettenansicht ich benutze:

let view = cell.contentView.subviews.first?.subviews.first 

statt:

let view = cell.contentView.subviews.first 

, weil in diesem Fall der Etiketten eine Ebene weiter in der Zelle sind.

0

Hier ist eine weitere Möglichkeit, dies zu tun. Dieser garantiert, dass Sie auf alle Etiketten in der Ansichtshierarchie der Zelle zugreifen, egal auf welcher Ebene sie sind:

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) 
     } 
    } 
}