您好吗?有一种简单的方法可以将值作为EnvironmentObject
放在UserDefaults中以显示在其他视图中?类似于在SettingsView中设置用户名并显示在DashboardView中。非常感谢
答案 0 :(得分:0)
最后找到它How do I use UserDefaults with 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和字符串的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类中使用的属性包装器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()
}
}