ios - SwiftUI 如何实现暗模式切换和刷新所有视图
问题描述
我想实现一个简单的切换来手动在暗模式和亮模式之间切换。但是,我不知道如何在切换切换后让我的应用程序刷新(重绘所有窗口)。
到目前为止,我找到了这些答案Manually set light/dark mode in SwiftUI和Implement dark mode switch in SwiftUI App。
SceneDelegate.shared
但是根据这个答案,这两种解决方案都不推荐使用。
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
解决方案
只需添加.colorScheme
到您的顶部视图并添加一个配色方案变量(@State
,@Binding
等)。每当变量改变视图(和孩子)自动更新。
struct ContentView: View {
@State var theColorScheme: ColorScheme = .dark
func toggleColorScheme() {
theColorScheme = (theColorScheme == .dark) ? .light : .dark
}
var body: some View {
ZStack { // or any other View
Color.primary // to make the change visible
Button(action: self.toggleColorScheme) {
Text("Toggle")
}
} .colorScheme(theColorScheme)
}
}
注意:如果要更新整个演示文稿的配色方案,最好使用.preferredColorScheme
而不是.colorScheme
.
推荐阅读
- java - JAVA:如何确定输入是否为回文?
- java - 在java中使用文件流时没有得到任何输出
- vim - 从vim中的书签目录模糊设置工作目录
- sql - 为什么 PATINDEX 不返回前导零以从 sql 中的字符串中提取数字?
- java - 低耦合理论与现实
- python - 在 Django 中哪里构建数据库对象(不使用 shell)?
- javascript - HTML/JS:暂停垂直滚动并为元素设置动画
- javascript - 将 Nest.js 应用程序导入为简单的 Express 中间件
- sql - 在 oracle sql 中运行列值的串联
- python - Numpy 2d 数组:在修改相邻元素时考虑边框元素