簡體   English   中英

SwiftUI 如何實現暗模式切換和刷新所有視圖

[英]SwiftUI How to implement dark mode toggle and refresh all views

我想實現一個簡單的切換來手動在暗模式和亮模式之間切換。 但是,我不知道如何在切換切換后讓我的應用程序刷新(重繪所有窗口)。

到目前為止,我找到了這些答案Manually set light/dark mode in SwiftUI and 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")
        }
    }
}

在我的 model 我有這個變量:

@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 {
        VStack { // or any other View
            Button(action: self.toggleColorScheme) {
                Text("Toggle")
            }
        }   .colorScheme(theColorScheme)
    }
}

這個解決方案對我有用

步驟1:

struct AppName: App {

@AppStorage("appTheme") private var isDarkModeOn = false

var body: some Scene {
    WindowGroup {
        MainTabView()
            .preferredColorScheme(isDarkModeOn ? .dark : .light)
    }
}}

第2步:

然后通過單擊按鈕更改此變量

var body: some View {

@AppStorage("appTheme") private var isDarkModeOn = false

    VStack {
            Button {
                self.isDarkMode.toggle()
            } label: {
                Image("dark_mode_icon")
            }
      }}





         

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM