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

如何让SwiftUI的confirmationDialog适配深色模式显示?

解决SwiftUI中confirmationDialog深色模式不适配的问题

你的问题核心是自定义的深色模式开关(isDarkMode)没有同步到视图的环境配色设置,导致系统原生的confirmationDialog仍跟随系统默认配色,而非你手动切换的模式。

解决步骤

  • 在NavigationStack上添加.preferredColorScheme(isDarkMode ? .dark : .light),将视图环境的配色方案与自定义的isDarkMode绑定,系统弹窗会自动适配深色/浅色模式。
  • 检查App根视图或全局层级是否设置了固定的colorScheme,避免覆盖子视图的自定义配色设置。

修改后的代码片段

import SwiftUI

struct SettingListView: View, Themeable {
    @Environment(\.dismiss) var dismiss
    @State private var showingConfirmation = false
    @Environment(\.colorScheme) var colorScheme
    @AppStorage("isDarkMode") private var isDarkMode = false
    @StateObject var settingsListViewModel = SettingsListViewModel()
    @State private var changeValueID = true
    @State private var showContacts = true
    
    var body: some View {
        NavigationStack {
            List {
                Section {
                    VStack {
                        ZStack(alignment: .bottomTrailing) {
                            Image("avatar")
                                .resizable()
                                .scaledToFill()
                                .frame(width: 120, height: 120)
                                .clipShape(Circle())
                                .onTapGesture {
                                    showingConfirmation = true
                                }
                                .confirmationDialog("Change Profile Picture", isPresented: $showingConfirmation, titleVisibility: .visible) {
                                    Button(role: .none, action: {}) {
                                        Text("Take Photo")
                                    }
                                    Button(role: .none, action: {}) {
                                        Text("Choose from library")
                                    }
                                    Button(role: .none, action: {}) {
                                        Text("Use Avatar")
                                    }
                                }
                            Image(systemName: "pencil")
                                .foregroundColor(isDarkMode ? .white : .black)
                                .frame(width: 28, height: 28)
                                .background(isDarkMode ? Color(#colorLiteral(red: 0.370555222, green: 0.3705646992, blue: 0.3705595732, alpha: 1)) : Color(#colorLiteral(red: 0.921431005, green: 0.9214526415, blue: 0.9214410186, alpha: 1)))
                                .clipShape(Circle())
                                .overlay {
                                    Circle().stroke(isDarkMode ? .black : Color(.secondarySystemBackground), lineWidth: 4)
                                }
                                .scaleEffect(x: 1.1, y: 1.1, anchor: .center)
                        }
                    }
                }
            }
        }
        // 绑定自定义深色模式到视图环境
        .preferredColorScheme(isDarkMode ? .dark : .light)
    }
}

如果你通过Themeable协议做全局主题管理,需确保协议实现中同步更新环境的colorScheme,避免出现控件配色不一致的情况。

内容的提问来源于stack exchange,提问作者user22231536

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 14:16:25