SwiftUI中Sheet配色方案第二次切换后不再更新问题求助
SwiftUI Sheet配色方案切换两次后失效的解决方案
在iOS 15环境下,用@AppStorage存储配色方案,通过Sheet内按钮切换时,仅能正常工作两次,之后isDarkMode的变更不再触发视图更新,onChange的打印也会停止。
问题原因
iOS 15中,Sheet的内容以闭包形式返回时,视图的环境绑定和生命周期存在异常。当Sheet关闭后重新打开,@AppStorage的绑定无法正确触发视图刷新,导致配色方案停止更新。
解决方法
把Sheet的内容提取成独立的View结构体,让@AppStorage的绑定在独立视图中管理,保证视图生命周期的独立性;同时将preferredColorScheme应用到整个Sheet视图,确保配色作用于整个Sheet环境。
修改后的代码
import SwiftUI struct SettingsView: View { @State private var showSheet = false @AppStorage("isDarkMode") private var isDarkMode = false var body: some View { Button("Show Sheet") { showSheet.toggle() } .sheet(isPresented: $showSheet) { ColorSchemeToggleSheetView() } } } // 独立的Sheet内容视图 struct ColorSchemeToggleSheetView: View { @AppStorage("isDarkMode") private var isDarkMode = false var body: some View { Button("Toggle Color scheme") { isDarkMode.toggle() } .preferredColorScheme(isDarkMode ? .dark : .light) .onChange(of: isDarkMode) { newValue in print("isDarkMode changed to \(newValue)") } } }
修改后,每次打开Sheet都会创建独立的ColorSchemeToggleSheetView实例,@AppStorage的绑定能正常响应变更,配色方案切换可以持续生效。如果需要让整个App的配色同步变更,也可以把preferredColorScheme应用到父视图的环境中。
内容的提问来源于stack exchange,提问作者SimHue7
相关产品推荐
相关产品推荐

