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

如何让SwiftUI应用跟随或忽略iPadOS深色/浅色配色方案

实现iPadOS应用跟随/忽略系统配色方案的正确方式

你的思路方向是对的,但需要把Picker的选择和应用全局的配色控制关联起来,同时调整状态变量的逻辑。以下是完整的实现方案:

核心思路

通过preferredColorScheme修饰符在应用全局层级控制配色方案,结合@AppStorage持久化用户的选择(跟随/忽略系统)和自定义配色状态,实现需求的功能。

完整代码实现

1. 应用全局配色控制

在你的App结构体中添加全局配色逻辑:

@main
struct YourApp: App {
    // 持久化存储用户选择的显示模式:0=忽略系统,1=跟随系统
    @AppStorage("displayMode") private var displayMode = 0
    // 持久化存储忽略系统时的自定义深色模式开关
    @AppStorage("customDarkMode") private var customDarkMode = false
    
    var body: some Scene {
        WindowGroup {
            SLDarkmodeSettingsView()
                .preferredColorScheme(colorSchemeToApply)
        }
    }
    
    // 根据用户选择计算要应用的配色方案
    private var colorSchemeToApply: ColorScheme? {
        if displayMode == 0 {
            // 忽略系统,使用自定义设置
            return customDarkMode ? .dark : .light
        } else {
            // 跟随系统,传递nil让系统自动决定
            return nil
        }
    }
}

2. 修改设置页面交互逻辑

更新设置视图,关联Picker和Toggle的状态,并优化交互体验:

import SwiftUI

struct SLDarkmodeSettingsView: View {
    @Environment(.colorScheme) var systemColorScheme
    @AppStorage("displayMode") private var displayMode = 0
    @AppStorage("customDarkMode") private var customDarkMode = false
    
    var body: some View {
        NavigationStack {
            List {
                Section {
                    // 仅当选择「忽略系统配色」时,显示并启用深色模式Toggle
                    if displayMode == 0 {
                        Toggle(isOn: $customDarkMode) {
                            Text("Enable Darkmode")
                        }
                        .alert(isPresented: $customDarkMode) {
                            Alert(
                                title: Text("Warning"),
                                message: Text("Do you really want to enable Darkmode (beta)? Some modules are not adapted to darkmode."),
                                primaryButton: .default(Text("Cancel")) {
                                    customDarkMode = false
                                },
                                secondaryButton: .destructive(Text("Enable").fontWeight(.semibold)) {
                                    customDarkMode = true
                                }
                            )
                        }
                    }
                    
                    Picker(selection: $displayMode, label: Text("Display mode")) {
                        Text("Ignore system scheme").tag(0)
                        Text("Follow system scheme").tag(1)
                    }
                } header: {
                    Text("Darkmode settings")
                } footer: {
                    if displayMode == 1 {
                        Text("Currently following system scheme. Custom darkmode settings are disabled.")
                    } else {
                        Text("Toggle the button to enable custom Darkmode. This will override the system's color scheme.")
                    }
                }
            }
            .navigationTitle("Darkmode (BETA)")
            .navigationBarTitleDisplayMode(.inline)
        }
    }
}

#Preview {
    SLDarkmodeSettingsView()
}

关键逻辑说明

  • preferredColorScheme是SwiftUI控制应用配色的核心修饰符:传递nil时跟随系统设置,传递.light/.dark时强制使用对应配色。
  • 用@AppStorage存储用户选择,确保应用重启后设置依然有效。
  • 根据Picker选择动态显示/禁用Toggle,避免无效操作,提升交互合理性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:25:27