在设置了命名颜色之后,UIView的颜色无法通过编程方式更改

15
即使您创建了一个全新的单视图项目(Xcode 9.2),在资源目录中创建了一个单一命名颜色,将主视图控制器的背景颜色设置为IB中的此颜色,并尝试在viewDidLoad中更新背景颜色,背景颜色也不会改变。其他人有没有遇到过这种情况?这是正常行为吗?
view.backgroundColor = .red // Doesn't work, the asset color set in IB remains

1
不正常。如果您需要帮助,请发布您的代码。 - picciano
1
我不确定为什么这被标记为离题。我已经给出了重现问题的最短路径。显然,期望的行为是颜色会改变。我已经在我的问题中更新了代码... - Joris Weimar
2个回答

14

非常有趣,您是正确的,它并没有像预期那样改变颜色值。这可能是由于在超类中设置IB属性的时间延迟。将颜色更改包装在DispatchQueue.main.async中可以使其在viewDidLoad中正常工作。可能是因为此代码会在超类正在处理IB属性的操作之后最后被处理。希望这能解决问题。

DispatchQueue.main.async {
   self.view.backgroundColor = UIColor.blue
}

另外在viewDidLayoutSubviews和viewDidAppear中,即使没有使用DispatchQueue,它也可以正常工作,但与viewWillAppear中的viewDidLoad具有相同的行为,不能按预期工作。


1
好的,谢谢。你会期望在viewDidLoad时视图已经准备好了可以触摸。我会向苹果提交一个雷达报告。 - Joris Weimar
@JorisWeimar 完全同意。这让我想知道这些属性是否是异步加载的。请在此处粘贴数字,我会复制它。 - agibson007
1
顺便提一下,在观察backgroundColor的didSet时,发现颜色被设置了三次。一次是最初的,然后在viewDidLoad中我又设置了一次,然后似乎又以不同的颜色空间进行了设置。 - Joris Weimar
除了派遣之外,还有其他解决方案吗? - Csabi Vidó
@CsabiVidó 在 viewDidAppear 或 viewDidLayoutSubviews 中不需要使用 dispatch。 - agibson007
我会尝试寻找另一种解决方案并在此发布,因为在viewDidLoad中分派可能会导致一些不必要的显示延迟。 - Julius

1
这个问题已在iOS 13中得到解决(使用Xcode 11 beta 4在iOS 13上进行构建测试)。

不知道这个问题是在Xcode还是iOS13中修复的,或者两者兼而有之?祝好,Z。 - Zoltán

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接