[Xcode/SwiftUI] Light / Darkモードを制御する


ColorSchemeを使ってライトモードとダークモードをスイッチ出来るようにしてみる。

実装

ColorSchemeManager

import SwiftUI

final class ColorSchemeManager: ObservableObject {
    @Published var colorScheme: ColorScheme = .light

    func toggleColorScheme() {
        colorScheme = (colorScheme == .light) ? .dark : .light
    }
}

(アプリ名).swift

import SwiftUI

@main
struct SwiftUI_PlaygroundApp: App {
    @StateObject private var colorSchemeManager = ColorSchemeManager()
    var body: some Scene {
        WindowGroup {
            HomeView()
                .environmentObject(colorSchemeManager)
                .preferredColorScheme(colorSchemeManager.colorScheme)
        }
    }
}

メインのView

import SwiftUI

struct HomeView: View {
    @EnvironmentObject var colorSchemeManager: ColorSchemeManager

    var body: some View {
        VStack {
            Text("Current Mode: \(colorSchemeManager.colorScheme == .light ? "Light" : "Dark")")
                .padding()

            Button(action: {
                colorSchemeManager.toggleColorScheme()
            }) {
                Text("Toggle Dark/Light Mode")
                    .padding()
                    .background(Color.blue)
                    .foregroundColor(.white)
                    .cornerRadius(8)
            }
        }
        .padding()
    }
}

ついでに@EnvironmentObjectを知ってみよう

MyGPT君に@EnvironmentObjectをわかりやすく説明してもらってみる。

どのビューからでもアクセス可能になって、データの一元管理が楽になるってことですな。