SwiftUI如何实现暗模式切换和刷新所有视图

时间:2020-05-20 11:48:53

标签: ios swift swiftui ios13 ios-darkmode

我想实现一个简单的切换,以便在暗和亮模式之间手动切换。但是,我不知道在切换开关后如何刷新应用程序(重新绘制所有窗口)。

到目前为止,我找到了这些答案Manually set light/dark mode in SwiftUIImplement 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

1 个答案:

答案 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)
    }
}