首页 > 解决方案 > SwiftUI 如何实现暗模式切换和刷新所有视图

问题描述

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

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

标签: iosswiftswiftuiios13ios-darkmode

解决方案


只需添加.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.


推荐阅读