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
相关产品推荐
相关产品推荐

