Невозможно программно изменить набор цветов в раскадровке как цвет из каталога xcassets - PullRequest
0 голосов
/ 02 декабря 2018

Когда я устанавливаю цвет некоторого свойства в раскадровке (например, textColor моего UILabel) как цвет, созданный как новый набор цветов в каталоге xcassets

enter image description here

тогда я не могу программно изменить этот цвет с первой попытки:

label.textColor = UIColor(named: "HighlightedGreen")

... обратите внимание, что я вызываю его из метода источника данных cellForItemAt.

Hack: Я могу решить эту проблему, установив этот цвет в раскадровке для любого другого цвета, выбранного из палитры цветов, но я хочу знать, почему это происходит.

Итак, почему это происходит

1 Ответ

0 голосов
/ 03 декабря 2018

Когда UIView subClass, такой как UITableViewCell, загружен из Storyboard/Xib, он применяет атрибуты, указанные в Attribute Inspector, ко всем subViews.У нас есть следующие методы обратного вызова, чтобы знать, когда представление загружается из Storyboard/Xib,

override func prepareForInterfaceBuilder() {
    super.prepareForInterfaceBuilder()        
}

override func awakeFromNib() {
    super.awakeFromNib()
}

. Эти методы могут быть хорошими кандидатами для добавления / удаления подпредставления, но они не должны обновлять подпункт size или некоторые из attribute inspector связанных свойств.Рекомендуемый метод для обновления подвидов - когда суперпредставление завершает загрузку и применяет все свойства attribute inspector и вызывает layoutSubviews.Итак, вы должны применить любое косметическое изменение к подпредставлению.например,

override func layoutSubviews() {
    super.layoutSubviews()

    label.textColor = UIColor(named: "HighlightedGreen")
}

Для UITableViewCell любой объект, реализующий UITableViewDataSource, также гарантирует, что delegate метод применяет любое косметическое изменение до отображения ячейки, как показано ниже, так что это также еще один хорошийкандидат на смену цвета.

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    (cell as! MyListTableViewCell).label.textColor = UIColor(named: "HighlightedGreen")
}
...