如果我使用来自 xib 的自定义颜色,为什么 iOS 不会覆盖背景颜色?

Ali*_*pan 11 xcode ios swift

我有一个xib。我有一个加载 xib 并将其添加到其子视图的视图控制器。xib 具有从 xib 文件(从界面)到资产(由我创建)的自定义颜色集设置的背景颜色。一切正常。

现在,在我的视图控制器中,在 viewDidLoad 中,我想用其他东西覆盖该背景颜色。我发现并 100% 复制的问题是覆盖不会做任何事情,除非我在 viewDidAppear 中做。

所以总结...

  • 从 xib 设置的自定义颜色背景...在 viewDidLoad 中覆盖不起作用,在 viewDidAppear 中覆盖工作

  • 从 xib 设置的Xcode默认颜色背景(除资产自定义颜色之外的任何其他颜色)...在 viewDidLoad WORKS 中覆盖...

为什么在第一种情况下我不能覆盖颜色而在第二种情况下我可以?

是否有我在这里缺少的隐藏功能?如果从 xib 设置的颜色是自定义颜色,则您根本无法覆盖 viewDidLoad 中的视图背景颜色,但如果它是任何其他颜色......例如白色、红色、黑色或 w/e Xcode 已经让一切按预期工作。

如果它有任何影响......我正在谈论的这个视图控制器被推送到导航堆栈上。但我看不出这会产生什么影响。


繁殖步骤:

要复制这个...创建一个新的示例项目...其中只有一个视图控制器。接下来通过资产 -> 新颜色集添加自定义颜色。将视图控制器视图背景颜色从故事板设置为新添加的颜色集。然后在 viewDidLoad 中将视图的背景颜色更改为其他颜色...您会注意到,如果您运行该应用程序,它不会更改,如果在故事板中有一个自定义颜色设置为背景。

不知何故,从故事板覆盖设置的背景自定义颜色发生在 viewDidLoad 之后和 viewDidAppear 之前的幕后。

vme*_*yer 9

我来晚了,但为未来的读者提供了更多信息。我刚刚在我的 iOS 11 和 iOS 12 应用程序中遇到了这个错误。从 iOS 13.0 开始,Apple 解决了这个错误。因此,如果您支持以前的版本,您仍然需要应用@AlanS 的解决方法,或者不在 storyboard 和 xib 中使用自定义颜色:

func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    if #available(iOS 13.0, *) {
        // Fix iOS 12 storyboard color bug.
    } else {
        view.backgroundColor = UIColor.black
    }
}
Run Code Online (Sandbox Code Playgroud)