SwiftUI:具有UserDefault的数组-删除后项目不断返回



我正在尝试创建一个列表,用户可以在其中删除项目。但在我关闭应用程序后,这些项目不断返回。我能感觉到这是因为List/ForEach一直在读取数组的原始值,而不是保存的数组。但我不知道如何做到这一点。我在UserDefault上找到的所有教程都谈到了用JSON编码项目然后保存它。那些实际上是关于在数组上使用UserDefault的教程太简单了。

任何帮助都会被告知。谢谢

import Foundation
import SwiftUI
let userDefaults = UserDefaults.standard
struct ContentView: View {

@State private var array: [String] = ["one", "two", "three"]

var body: some View {
List{
ForEach(array, id: .self) { item in
Text("(item)")
}
.onDelete(perform: delete)

Text("abc")
}
}

func delete(offsets: IndexSet){
array.remove(atOffsets: offsets)
userDefaults.set(array, forKey: "List1")
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
如果您真的想直接使用UserDefaults,请尝试这样的方法。否则,请使用AppStorage,请参阅:https://developer.apple.com/documentation/swiftui/appstorage
struct ContentView: View {
@State private var array: [String] = []

var body: some View {
List{
ForEach(array, id: .self) { item in
Text(item)
}.onDelete(perform: delete)
Text("abc")
}
.onAppear {
if let results = UserDefaults.standard.object(forKey: "List1") as? [String] {
array = results
} else {
array = ["one", "two", "three"]
}
}
}

func delete(offsets: IndexSet){
array.remove(atOffsets: offsets)
UserDefaults.standard.set(array, forKey: "List1")
}
}

数据应该保存在模型中,而视图显示数据并响应数据的更改。

import SwiftUI
class ViewModel: ObservableObject {
@Published private(set) var array: [String] = []
private struct Constants {
static let defaultsKey = "List1"
}
init() {
let array = restore()
if let array = array, array.count > 0 {
self.array = array
} else {
self.array = ["one", "two", "three"]
}
}
func delete(offsets: IndexSet){
array.remove(atOffsets: offsets)
store()
}
private func store() {
UserDefaults.standard.set(array, forKey: Constants.defaultsKey)
}
private func restore() -> Array<String>? {
return UserDefaults.standard.object(forKey: Constants.defaultsKey) as? Array<String>
}
}

struct ContentView: View {
@ObservedObject var viewModel: ViewModel
init(viewModel: ViewModel) {
self.viewModel = viewModel
}
var body: some View {
List{
ForEach(viewModel.array, id: .self) { item in
Text("(item)")
}
.onDelete(perform: delete)
Text("abc")
}
}
func delete(offsets: IndexSet){
viewModel.delete(offsets: offsets)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView(viewModel: ViewModel())
}
}