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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:06:30