我想实现一个简单的切换,以便在暗和亮模式之间手动切换。但是,我不知道在切换开关后如何刷新应用程序(重新绘制所有窗口)。
到目前为止,我找到了这些答案Manually set light/dark mode in SwiftUI和Implement dark mode switch in SwiftUI App。
但是这两种解决方案都使用SceneDelegate.shared
,根据此answer,我们不建议这样做。
var isDark: Bool = true {
didSet { SceneDelegate.shared?.window!.overrideUserInterfaceStyle = isDark ? .dark : .light }
}
真的没有其他选择可实现此目标吗?我尝试添加@Environment
变量,但是在应用程序启动时它只能工作一次。而且我需要我的应用在切换更改时更新配色方案。
.environment(\.colorScheme, settings.isDarkMode ? .dark : .light)
这是我的切换
struct SettingsView: View {
var body: some View {
Toggle(isOn: $settings.isDarkMode) {
Text("Night mode")
}
}
}
在我的模型中,我有这个变量:
@UserDefaultsBacked(key: UserDefaults.Keys.Settings.darkMode, defaultValue: false)
var isDarkMode: Bool
答案 0 :(得分:1)
只需在顶部视图中添加.colorScheme
并添加配色方案变量(@State
,@Binding
等)。每当变量更改时,视图(和子视图)都会自动更新。
struct ContentView: View {
@State var theColorScheme: ColorScheme = .dark
func toggleColorScheme() {
theColorScheme = (theColorScheme == .dark) ? .light : .dark
}
var body: some View {
VStack { // or any other View
Button(action: self.toggleColorScheme) {
Text("Toggle")
}
} .colorScheme(theColorScheme)
}
}