SwiftUI устанавливает строковое значение внутри UserDefaults, но как `EnvironmentObject` - PullRequest
0 голосов
/ 06 февраля 2020

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

1 Ответ

0 голосов
/ 07 февраля 2020

Наконец, найдите его Как использовать 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 для строки

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()
        }
    }
}

Оболочка свойства UserDefaults, используемая в классах UserSettings и UserName

@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)
        }
    }
}

В первом представлении панели мониторинга были представлены изменения, которые были сделано в представлении настроек

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)")
    }
}

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

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()
    }
}
...