SwiftUI устанавливает строковое значение внутри UserDefaults, но как ʻEnvironmentObject`

Здравствуйте, существует простой способ поместить значения в UserDefaults как EnvironmentObjectдля отображения в других представлениях? Что-то вроде установки имени пользователя в SettingsView и отображения в DashboardView. Большое спасибо

1 ответ

Наконец-то найди. Как мне использовать UserDefaults с SwiftUI?

Ответ основан только на Bool. Ее решение сделать это сString слишком.

ContentView, настроенный с помощью TabView:

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            TabView{
                Dashboard(userName: UserName())
                    .tabItem({
                        Image(systemName: "rectangle.3.offgrid")
                        Text("Dashboard")
                    })
                Settings()
                    .tabItem({
                        Image(systemName: "gear")
                        Text("Einstellungen")
                    })
            }
        }
    }
}

#if DEBUG
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
#endif

UserSettings для Bool и UserName для String

import SwiftUI
import Combine


final class UserSettings: ObservableObject {

    let objectWillChange = PassthroughSubject<Void, Never>()

    @UserDefault("ShowOnStart", defaultValue: true)
    var showOnStart: Bool {
        willSet {
            objectWillChange.send()
        }
    }
}

final class UserName: ObservableObject {

    let objectWillChange = PassthroughSubject<Void, Never>()

    @UserDefault("userName", defaultValue: "UknowName")
    var userNameSet: String {
        willSet {
            objectWillChange.send()
        }
    }
}

Свойство Wrapper UserDefaults, используемое в UserSettings и UserName class

@propertyWrapper
struct UserDefault<T> {
    let key: String
    let defaultValue: T

    init(_ key: String, defaultValue: T) {
        self.key = key
        self.defaultValue = defaultValue
    }

    var wrappedValue: T {
        get {
            return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue
        }
        set {
            UserDefaults.standard.set(newValue, forKey: key)
        }
    }
}

На панели инструментов First View представлены изменения, внесенные в представление настроек.

import SwiftUI

struct Dashboard: View {
    @ObservedObject var settings = UserSettings()
    @ObservedObject var userName = UserName()
    var body: some View {
        VStack{
            Text("hallo")

            ExtractedViewName(userName: userName)
                ExtractedView(settings: settings)

        }
    }
}

struct Dashboard_Previews: PreviewProvider {
    static var previews: some View {
        Dashboard(userName: UserName())
    }
}

struct ExtractedView: View {
    @ObservedObject var settings : UserSettings
    var body: some View {
        VStack{
        if settings.showOnStart{
        Text("Welcome")
        }
        }
    }
}

struct ExtractedViewName: View {
    @ObservedObject var userName : UserName
    var body: some View {
        Text("Test One: \(userName.userNameSet)")
    }
}

Настройки второго вида устанавливают изменения, которые отображаются в представлении панели инструментов.

import SwiftUI

struct Settings: View {
   @ObservedObject var settings = UserSettings()
@ObservedObject var userName = UserName()
    @State private var userTextfield = ""
    var body: some View {
        VStack {
            Toggle(isOn: $settings.showOnStart) {
                Text("Show welcome text")
            }
            TextField("Name", text: $userTextfield){
                self.userName.userNameSet = self.userTextfield
            }
            Button(action: {
                print("\(self.userName.userNameSet)")
            }) {
                Text("Button")
            }
        }
        }
}

struct Settings_Previews: PreviewProvider {
    static var previews: some View {
        Settings()
    }
}
Другие вопросы по тегам