• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-11 20:52:44 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

最新的 XCode。我有一个项目,其中在任何 Storyboard / View Controller 中设置属性,例如 UILabeltextColorUIButton< 的 backgroundColor viewDidLoad 中的/code> 不起作用,但在 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”中更新。

编辑:更新代码以显示某些东西有效而另一些无效

EDIT 2:使用 viewDidAppear 的问题是屏幕显示了一组颜色(在设计器中指定),但随后所有颜色都在用户面前切换- 看起来很难看。任何形式的延误都无济于事。目标是在动画进入视野之前用所有颜色等“准备”屏幕。而且这些颜色依赖于一些动态数据,不能在设计器中指定。

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 中进行所有此类初始化。我从未见过有人在 viewDidLayoutSubviewsviewDidAppear 中这样做。我看的时间还不够长吗?我错过了什么?



Best Answer-推荐答案


没有错。它在执行代码之前渲染了标签。试试下面的代码就行了

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

关于ios - 在 viewDidLoad 中快速设置属性不起作用,但在 viewDidAppear 中有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53531996/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap