Swift UIAppearance覆盖UILabel上的自定义文本颜色

Swift UIAppearance覆盖UILabel上的自定义文本颜色,swift,uilabel,interface-builder,uiappearance,ibdesignable,Swift,Uilabel,Interface Builder,Uiappearance,Ibdesignable,我使用以下方法在我的应用程序代理中设置UILabel外观: UILabel.appearance().textColor = UIColor.white 我还有一个自定义UIView子类,它包含一个UILabel和一些其他元素(此处省略): 如果我在故事板中实例化CustomView,一切正常。但是,如果我在代码中实例化它,则descriptionLabel是白色(外观颜色),而不是黑色(我设置的颜色)。这是怎么回事?我的理解是,如果我设置了自定义颜色,则不会使用外观颜色。您遇到的只是UIAp

我使用以下方法在我的应用程序代理中设置UILabel外观:

UILabel.appearance().textColor = UIColor.white
我还有一个自定义UIView子类,它包含一个UILabel和一些其他元素(此处省略):


如果我在故事板中实例化
CustomView
,一切正常。但是,如果我在代码中实例化它,则descriptionLabel是白色(外观颜色),而不是黑色(我设置的颜色)。这是怎么回事?我的理解是,如果我设置了自定义颜色,则不会使用外观颜色。

您遇到的只是UIAppearance代理将其设置应用于新UIView的确切时间问题。我们什么时候可以假设它会这样?在
init
之前,它不可能这样做,因为
init
是UIView生命周期中发生的第一件事。因此,事件的顺序如下:

override init(frame: CGRect) {
    super.init(frame: frame)
    setup() // black
}
// and some time later, UIAppearance proxy comes along and sets it to white
因此,您的目标是在标签生命早期调用
setup
,当然是在用户有机会看到它之前,但不要过早调用UIAppearance代理。让我们将对
setup
的调用移到标签生命周期的稍后一点:

// some time earlier, UIAppearance proxy sets it to white
override func didMoveToSuperview() {
    setup() // black
}
现在,我们是在外观代理有机会采取行动之后才采取行动的,因此您的设置是最后一个操作的设置,他们赢得了这一天


我们仍然不知道何时可以将调用移动到
setup
,并且在遵守外观代理设置后仍然可以进行调用。如果你有时间的话,你可能想尝试一下。例如,
willMoveToSuperview
更早;如果您在那里(而不是在
didMoveToSuperview
中)调用
setup
,是否有效?玩一玩就知道了

您是否已验证是否实际调用了
setup
,但是要通过编程实现。实现
didMoveToSuperview
并在那里调用安装程序。这确实有效,但您能解释一下原因吗?我知道当视图移动到superview/window时,会设置UIAppearance属性,但我也有这样的印象,即设置自定义值将防止出现这种情况。我不认为如果项目中的其他开发人员在6个月后会以类似的方式使用UILabel,他/她将永远无法理解为什么设置textColor根本没有效果……感谢您的回复。我仍然认为我不太明白UIAppearance应该如何使用,但是-如果使用它意味着我不能在interface builder中自定义UILabel,并且在代码中只能通过每次使用它来跳转,那么对我来说,这似乎是一个非常有缺陷的设计。我想那时我就不能用这个了。尽管如此,您的答案仍然有效,并且解释得很好,因此我将接受它;-)
// some time earlier, UIAppearance proxy sets it to white
override func didMoveToSuperview() {
    setup() // black
}