最新的XCode。我有一个项目,其中在任何情节提要/视图控制器中设置属性,例如textColor
中UILabel
的{{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
}
中进行所有此类初始化。我从未见过有人在viewDidLoad
或viewDidLoad
中这样做。我看起来还不够长吗?我想念什么?
答案 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)
答案 2 :(得分:0)
viewWillAppear比viewDidAppear更好。
viewDidLoad应该可以工作。您是否设置了断点并检查您的代码是否真正被调用?如果子类不调用super.viewDidLoad(),则不会调用它。
您是否检查了theLabel和theButton不为零?您是否检查过代码以确保未在其他位置设置theLabel和theButton?
答案 3 :(得分:0)
我也在 iOS 12
中看到了这个问题。该错误仅在您通过 Storyboard
分配颜色时发生。如果您在 Storyboard
上使用默认颜色,那么一切都会按预期进行。这是 iOS 版本 13 中修复的错误。
我找到了几种方法来解决这个问题:
Storyboard
上的默认颜色(保留默认颜色),而是直接在代码中指定它。在这种情况下,您可以指定一种颜色,包括在 viewDidLoad
DispatchQueue.main.async {}
中,并仍然在 viewDidLoad
中使用它viewDidAppear
,但在这种情况下,视图可能会闪烁。将代码移至 viewWillAppear
并不能解决问题!