Вот что у меня есть: < /p>
Код: Выделить всё
enum Theme: CaseIterable, Identifiable, Equatable {
var id: Self { self }
case standard
case green
var accent: Color {
switch self {
case .standard:
return Color.accent
case .green:
return Color.green
}
var description: String {
switch self {
case .standard:
"Standard"
case .green:
"Green"
}
}
}
< /code>
и простой менеджер: < /p>
@Observable
final class ThemeManager {
var theme: Theme = .standard
var accent: Color { theme.accent }
var description: String { theme.description }
}
< /code>
Я добавляю его в значения среды: < /p>
extension EnvironmentValues {
@Entry var themeManager = ThemeManager()
}
@State private var theme = ThemeManager()
< /code>
И я добавляю его в среду, как это: < /p>
ContentView().environment(themeManager)
< /code>
Затем в моем представлении (настройки) я делаю это: < /p>
@Environment(\.themeManager) private var themeManager
< /code>
и используйте его так: < /p>
private extension SettingsView {
@ViewBuilder
var test: some View {
@Bindable var themeManager = themeManager
Section {
Picker("", selection: $themeManager.theme) {
ForEach(Theme.allCases) { themeEnum in
Text(themeEnum.description).tag(themeEnum.id)
.foregroundStyle(themeEnum.accent)
}
}
.onChange(of: themeManager.theme, { oldValue, newValue in
print("Theme manager old value \(oldValue), newValue \(newValue)")
})
.pickerStyle(.inline)
.labelsHidden()
} header: {
Text("Theme")
}
}
}
< /code>
Итак, у меня есть три вкладки, и одна из них - это настройка, где я пытаюсь изменить тему.@Environment(\.themeManager) private var themeManager
< /code>
Я что -то упускаю? Как правильный способ реализовать это, так что изменение темы применяется во всем мире?
Подробнее здесь: https://stackoverflow.com/questions/797 ... in-swiftui
Мобильная версия