You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI Sheet内修改深浅模式时Sheet视图UI未自动刷新问题

问题原因

preferredColorScheme修饰符的作用域仅限当前视图及其子视图,而SwiftUI中sheet弹出的视图是独立的渲染层级,不会继承父视图的配色配置。你当前只给ContentView加了配色设置,已经弹出的Sheet不会监听viewManager.colorScheme的变化同步更新配色,只有下次弹出时才会读取最新值。

修复方案

给SettingsSheet的根视图也添加相同的preferredColorScheme修饰符即可,修改后的SettingsSheet代码如下:

struct SettingsSheet: View {
    @Environment (\.presentationMode) var presentationMode
    @EnvironmentObject var viewManager: ViewManager

    var body: some View {
        NavigationView{
            GroupBox {
                Picker("Display Mode", selection: $viewManager.colorScheme) {
                    Text("System").tag("System")
                    Text("Light").tag("Light")
                    Text("Dark").tag("Dark")
                }
                .pickerStyle(.segmented)
            }
            .toolbar {
                ToolbarItem {
                    Button(action: {
                        presentationMode.wrappedValue.dismiss()
                    }){
                        Text("Done")
                    }
                }
            }
        }
        // 新增这一行,和ContentView保持相同的配色逻辑
        .preferredColorScheme(viewManager.colorScheme == "Light" ? .light : viewManager.colorScheme == "Dark" ? .dark : nil)
    }
}

可选优化

可以把配色转换逻辑封装到ViewManager中,减少重复代码:

class ViewManager: ObservableObject {
    @AppStorage("colorScheme") var colorScheme: String = "System"
    
    var wrapColorScheme: ColorScheme? {
        switch colorScheme {
        case "Light": return .light
        case "Dark": return .dark
        default: return nil
        }
    }
}

之后ContentView和SettingsSheet的preferredColorScheme都可以简化为.preferredColorScheme(viewManager.wrapColorScheme)。

内容的提问来源于stack exchange,提问作者blu-Fox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:27:03