如何使UIAppearance代理适用于编程创build的意见?

我试图使用UIAppearance来为我的应用程序创build一个主题。

说我想我所有的UILabel的文本是橙色的。 我写了:

 UILabel.appearance(whenContainedInInstancesOf: [UIView.self]).textColor = .orange 

但是我意识到:

  • 这适用于通过Interface Builder创build的每个UILabel
  • 这不适用于以编程方式创build的任何UILabel 。 它们默认显示为黑色

任何想法如何强制以编程方式创build的实例也是橙色的?

PS:我也试过: UILabel.appearance().textColor = .green这不是我想要的,但也不起作用。

经过一番search…

显然, 在界面生成器创build的 UI元素(如标签)受到.appearance()设置的影响并不是真正有意的,并且可能不可靠。

事实上,文件似乎相当混乱和误导。

为了支持外观定制,一个类必须符合UIAppearanceContainer协议,相关的访问器方法必须用UI_APPEARANCE_SELECTOR标记。

唯一采用UIAppearance协议的类是

  • UIBarItem
  • UIView

而唯一采用UIAppearanceContainer协议的类是

  • UIPopoverController
  • UIPresentationController
  • UIView
  • UIViewController

所以…最好的办法可能是将你的标签分类。

相关的答案可以在这里find: 如何使用Swift默认UILabel字体和大小

从这个链接:“UIAppearance只允许你在Objective-C头文件中设置标记为UI_APPEARANCE_SELECTOR的属性,因为UILabel没有这样的属性,所以不能用UIAppearance来设置样式”

也来自: https : //developer.apple.com/documentation/uikit/uiappearance

“当视图进入一个窗口时,iOS会应用外观变化,它不会改变已经在窗口中的视图的外观。要改变当前窗口中的视图的外观,从视图层次中移除视图,然后把它放回去。“

也从这里: UIAppearance和UIButton子类的麻烦

“这样工作的原因是因为外观属性是在视图添加到视图层次结构时应用的,并且在将视图添加到视图层次结构之前应用了Nib定义的属性。

我尝试在编程添加视图控制器到层次结构之前,在新类视图控制器的实例中设置标签的外观,但没有运气。