enum Theme: String {
case light, dark, system
// Utility var to pass directly to window.overrideUserInterfaceStyle
var uiInterfaceStyle: UIUserInterfaceStyle {
switch self {
case .light:
return .light
case .dark:
return .dark
case .system:
return .unspecified
}
}
}
3条答案
按热度按时间3lxsmp7m1#
你可以使用
overrideUserInterfaceStyle
属性覆盖单个视图或视图控制器的样式,但由于窗口也是一个视图,你可以在主窗口上设置它,强制它进入亮或暗模式:klsxnrf12#
我想对“弗兰克·施莱格尔”提供的答案进行更详细的阐述。
要从应用中的另一个视图控制器更改主题(我认为这是您最初要求的),您可以为将触发更改的
UserDefaults
值添加观察器。我将添加枚举以更好地表示主题状态
在
SceneDelegate
中,在window
初始化下,必须添加每次UserDefaults
更改值时触发的此方法。此外,如果您希望在取消初始化
SceneDelegate
时删除该观察器,请添加这将在
UserDefaults
中放置该theme
值的观察者。要处理更改,需要将此方法添加到
SceneDelegate
类中。每次
theme
值在UserDefaults
中更改时都会执行此操作,并将从一个主题转换为另一个主题。现在,要从应用中的其他视图控制器更改主题,您只需更改
UserDefaults
的值。ivqmmu1c3#
您可以使用其中一种观察方式,例如
Defaults
lib,然后添加到