1

您好,是否存在一种将值放入 UserDefaultsEnvironmentObject以在其他视图中显示的简单方法?在 SettingsView 中设置用户名并显示在 DashboardView 中。多谢

4

1 回答 1

1

终于找到了如何在 SwiftUI 中使用 UserDefaults?

答案仅基于Bool. 她也是解决方案String

使用 TabView 设置的 ContentView:

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

Bool 的 UserSettings 和 String 的 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()
        }
    }
}

在 UserSettings 和 UserName 类中使用的 Property Wrapper UserDefaults

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

第二个视图设置那里设置显示在仪表板视图中的更改

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()
    }
}
于 2020-02-06T22:21:50.193 回答