UserDefault 值不会在列表 SwiftUI 中更新
UserDefault value does not update in a list SwiftUI
我有两个视图,嵌入在 TabView 中。
我在名为 usersettings 的 class 中使用 userdefaults。
class UserSettings: ObservableObject {
@Published var favList: [String] {
willSet {
print("willset")
}
didSet {
UserDefaults.standard.set(favList, forKey: "isAccountPrivate")
print("didset")
}
}
init() {
self.favList = UserDefaults.standard.object(forKey: "isAccountPrivate") as? [String] ?? ["Sepetiniz Boş"]
}
}
在按钮视图中,它的作用类似于 add/remove 收藏夹。它成功地添加和删除了 UserDefaults。但是当我添加一些东西时它没有显示在另一个视图上(请参阅 FavButton 之后的下一个代码)
struct FavButton: View {
@Binding var passedFood: String
@ObservedObject var userSettings = UserSettings()
var body: some View {
Button(action: {
if userSettings.favList.contains(passedFood) {
userSettings.favList.remove(at: userSettings.favList.firstIndex(of: passedFood )!)
} else {
userSettings.favList.append(passedFood)
}
})
}
}
但它不会更新我在另一个视图中的列表,除非我关闭并打开我的应用程序。如果我从列表中删除某些内容,它实际上会从 userdefault 中删除。
如果我在此视图中添加一个新词,它也有效。
我唯一的问题是,当我从另一个视图 (FavButton) 添加内容时,它没有显示在此视图 (FavView) 中。
struct FavView: View {
@ObservedObject var userSettings = UserSettings()
@State private var newWord = ""
var body: some View {
NavigationView {
List {
TextField("Ürün Ekleyin...", text: $newWord, onCommit: addNewWord)
ForEach( self.userSettings.favList, id: \.self) { list in
Text(list)
.font(.headline)
.padding()
}
.onDelete(perform: self.deleteRow)
}
.navigationTitle("Sepetim")
}
}
private func deleteRow(at indexSet: IndexSet) {
self.userSettings.favList.remove(atOffsets: indexSet)
}
private func addNewWord() {
let answer = newWord.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)
self.userSettings.favList.append(answer)
guard answer.count > 0 else {
return
}
newWord = ""
}
}
您需要在所有想要观察用户设置的视图中使用相同的 UserSettings
实例,例如
class UserSettings: ObservableObject {
static let global = UserSettings()
//... other code
}
现在
struct FavButton: View {
@ObservedObject var userSettings = UserSettings.global // << here !!
// ... other code
}
和
struct FavView: View {
@ObservedObject var userSettings = UserSettings.global // << here !!
// ... other code
}
遵循 SwiftUI 习惯用法的更好方法是使用 .environmentObject()
修饰符。
当您声明您的应用时:
struct AppScene: App {
@StateObject private var userSettings = UserSettings() // Use state object to persist the object
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(userSettings) // Inject userSettings into the environment
}
}
}
然后在您 ContentView
中,您可以进入您的环境并获取对象:
struct ContentView: View {
@EnvironmentObject private var userSettings: UserSettings
var body: some View {
Text("Number of items in favList: \(userSettings.favList.count)")
}
}
我有两个视图,嵌入在 TabView 中。 我在名为 usersettings 的 class 中使用 userdefaults。
class UserSettings: ObservableObject {
@Published var favList: [String] {
willSet {
print("willset")
}
didSet {
UserDefaults.standard.set(favList, forKey: "isAccountPrivate")
print("didset")
}
}
init() {
self.favList = UserDefaults.standard.object(forKey: "isAccountPrivate") as? [String] ?? ["Sepetiniz Boş"]
}
}
在按钮视图中,它的作用类似于 add/remove 收藏夹。它成功地添加和删除了 UserDefaults。但是当我添加一些东西时它没有显示在另一个视图上(请参阅 FavButton 之后的下一个代码)
struct FavButton: View {
@Binding var passedFood: String
@ObservedObject var userSettings = UserSettings()
var body: some View {
Button(action: {
if userSettings.favList.contains(passedFood) {
userSettings.favList.remove(at: userSettings.favList.firstIndex(of: passedFood )!)
} else {
userSettings.favList.append(passedFood)
}
})
}
}
但它不会更新我在另一个视图中的列表,除非我关闭并打开我的应用程序。如果我从列表中删除某些内容,它实际上会从 userdefault 中删除。
如果我在此视图中添加一个新词,它也有效。
我唯一的问题是,当我从另一个视图 (FavButton) 添加内容时,它没有显示在此视图 (FavView) 中。
struct FavView: View {
@ObservedObject var userSettings = UserSettings()
@State private var newWord = ""
var body: some View {
NavigationView {
List {
TextField("Ürün Ekleyin...", text: $newWord, onCommit: addNewWord)
ForEach( self.userSettings.favList, id: \.self) { list in
Text(list)
.font(.headline)
.padding()
}
.onDelete(perform: self.deleteRow)
}
.navigationTitle("Sepetim")
}
}
private func deleteRow(at indexSet: IndexSet) {
self.userSettings.favList.remove(atOffsets: indexSet)
}
private func addNewWord() {
let answer = newWord.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)
self.userSettings.favList.append(answer)
guard answer.count > 0 else {
return
}
newWord = ""
}
}
您需要在所有想要观察用户设置的视图中使用相同的 UserSettings
实例,例如
class UserSettings: ObservableObject {
static let global = UserSettings()
//... other code
}
现在
struct FavButton: View {
@ObservedObject var userSettings = UserSettings.global // << here !!
// ... other code
}
和
struct FavView: View {
@ObservedObject var userSettings = UserSettings.global // << here !!
// ... other code
}
遵循 SwiftUI 习惯用法的更好方法是使用 .environmentObject()
修饰符。
当您声明您的应用时:
struct AppScene: App {
@StateObject private var userSettings = UserSettings() // Use state object to persist the object
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(userSettings) // Inject userSettings into the environment
}
}
}
然后在您 ContentView
中,您可以进入您的环境并获取对象:
struct ContentView: View {
@EnvironmentObject private var userSettings: UserSettings
var body: some View {
Text("Number of items in favList: \(userSettings.favList.count)")
}
}