Последний код XCode.У меня есть проект, в котором в любых настройках раскадровки / контроллера представления свойства, такие как textColor
для UILabel
или backgroundColor
для UIButton
в viewDidLoad
, не работают, но работают в viewDidAppear
.
Что меня убивает, так это то, что я не могу воспроизвести его в новом / другом простом проекте.
Кто-нибудь знает, что может быть не так?Это большой проект.Будет большой беспорядок, чтобы воссоздать его.У меня такое ощущение, что это неразрешимо.Пожалуйста, докажите, что я не прав.
Извините, не так много кода, кроме того, чтобы показать:
@IBOutlet weak var theTextField: UITextField!
@IBOutlet weak var theLabel: UILabel!
@IBOutlet weak var theButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
theTextField.text = "some text" //<<<- works
theTextField.textColor = UIColor.red //<<<- works
theLabel.textColor = UIColor.red //<<<- **doesn't work**
theButton.backgroundColor = UIColor.red //<<<- **doesn't work**
theButton.setTitleColor(UIColor.blue, for: UIControl.State.normal) //<<<- works
}
override func **viewDidAppear**(_ animated: Bool) {
super.viewDidAppear(animated)
theTextField.text = "some text" //<<<- works
theTextField.textColor = UIColor.red //<<<- works
theLabel.textColor = UIColor.red //<<<- **works**
theButton.backgroundColor = UIColor.red //<<<- **works**
theButton.setTitleColor(UIColor.blue, for: UIControl.State.normal) //<<<- works
}
Здесь theTextField обновляется нормально во всех случаях, но ярлык и кнопка выигралиНе обновлять в 'viewDidLoad'.
РЕДАКТИРОВАТЬ : обновлен код, показывающий, что некоторые вещи работают, а другие не
РЕДАКТИРОВАТЬ 2 :проблема с использованием viewDidAppear
заключается в том, что на экране отображается 1 набор цветов (указанный в дизайнере), но затем все цвета переключаются перед пользователем - что выглядит ужасно.И любые задержки не помогут.Цель состоит в том, чтобы «подготовить» экран ко всем цветам и тому подобное, прежде чем он будет анимирован.И эти цвета зависят от некоторых динамических данных и не могут быть указаны в конструкторе.
EDIT 3 : Я только что подумал, что выполнение всего этого в viewDidLayoutSubviews
дает мне то, что я хочу:
@IBOutlet weak var theTextField: UITextField!
@IBOutlet weak var theLabel: UILabel!
@IBOutlet weak var theButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
theTextField.text = "some text" //<<<- works
theTextField.textColor = UIColor.red //<<<- works
theLabel.textColor = UIColor.red //<<<- doesn't work
theButton.backgroundColor = UIColor.red //<<<- doesn't work
theButton.setTitleColor(UIColor.blue, for: UIControl.State.normal) //<<<- works
}
override func viewDidLayoutSubviews() {
super.viewDidAppear()
theTextField.text = "some text" //<<<- works
theTextField.textColor = UIColor.red //<<<- works
theLabel.textColor = UIColor.red //<<<- works
theButton.backgroundColor = UIColor.red //<<<- works
theButton.setTitleColor(UIColor.blue, for: UIControl.State.normal) //<<<- works
}
Похоже на возможное решение.Но почему?Зачем мне прибегать к обходному пути?Я действительно хотел бы понять, почему viewDidLoad
не работает в моем конкретном случае / проекте.Или это не обходной путь, а правильный способ сделать это?Везде, где я видел весь пример кода, каждый всегда выполняет такую инициализацию в viewDidLoad
.Я никогда не видел, чтобы кто-нибудь делал это в viewDidLayoutSubviews
или viewDidAppear
.Разве я не выглядел достаточно долго?Что мне не хватает?