在viewDidLoad中快速设置属性不起作用,但在viewDidAppear中起作用

时间:2018-11-29 04:47:09

标签: ios swift viewdidload viewdidappear

最新的XCode。我有一个项目,其中在任何情节提要/视图控制器中设置属性,例如textColorUILabel的{​​{1}}或backgroundColor的{​​{1}}工作,但可以在UIButton中工作。

使我丧命的是,我无法在新的/不同的简单项目中复制它。

任何人都知道什么可能是错误的?这是一个大项目。重新创建它会很麻烦。 我觉得这是无法解决的。请证明我错了。

很抱歉,除了以下内容外,没有太多代码可显示:

viewDidLoad

在所有情况下, theTextField 都可以很好地更新,但是'viewDidLoad'中的标签和按钮不会更新。

编辑:更新了代码以显示某些功能正常,而其他无效

编辑2 :使用viewDidAppear的问题是屏幕显示了一组颜色(在设计器中指定),但是所有颜色都在用户面前切换-看起来丑陋。而且任何形式的延误都无济于事。目的是在将其动画化为视图之前,以所有颜色“准备”屏幕。这些颜色取决于一些动态数据,不能在设计器中指定。

编辑3 :我只是想知道,在@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 } 中完成所有这些操作即可得到我想要的东西:

viewDidAppear

似乎是一种可能的解决方法。但为什么?为什么我需要采取解决方法?我真的很想了解为什么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 } 中进行所有此类初始化。我从未见过有人在viewDidLoadviewDidLoad中这样做。我看起来还不够长吗?我想念什么?

4 个答案:

答案 0 :(得分:0)

没有错。在执行代码之前,它渲染了标签。试试下面的代码,它将起作用

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

答案 1 :(得分:0)

将标签颜色设置为“默认”对我来说解决了同样的问题。

enter image description here

答案 2 :(得分:0)

viewWillAppear比viewDidAppear更好。

viewDidLoad应该可以工作。您是否设置了断点并检查您的代码是否真正被调用?如果子类不调用super.viewDidLoad(),则不会调用它。

您是否检查了theLabel和theButton不为零?您是否检查过代码以确保未在其他位置设置theLabel和theButton?

答案 3 :(得分:0)

我也在 iOS 12 中看到了这个问题。该错误仅在您通过 Storyboard 分配颜色时发生。如果您在 Storyboard 上使用默认颜色,那么一切都会按预期进行。这是 iOS 版本 13 中修复的错误。

我找到了几种方法来解决这个问题:

  1. 最好的选择! 不要更改 Storyboard 上的默认颜色(保留默认颜色),而是直接在代码中指定它。在这种情况下,您可以指定一种颜色,包括在 viewDidLoad
  2. 您可以将代码包装在 DispatchQueue.main.async {} 中,并仍然在 viewDidLoad 中使用它
  3. 您可以将代码传输到 viewDidAppear,但在这种情况下,视图可能会闪烁。将代码移至 viewWillAppear 并不能解决问题!