Свойства быстрой настройки в viewDidLoad не работают, но работают в viewDidAppear - PullRequest
0 голосов
/ 29 ноября 2018

Последний код 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.Разве я не выглядел достаточно долго?Что мне не хватает?

1 Ответ

0 голосов
/ 29 ноября 2018

Нет ничего плохого.Он визуализировал метку перед выполнением кода.Попробуйте приведенный ниже код, он будет работать

@IBOutlet weak var theLabel: UILabel!
override func viewDidLoad() {
    super.viewDidLoad()
    DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4), execute: {
        theLabel.textColor = UIColor.red
    })
}
...