我正在尝试编写一些代码,如果新项目尚不存在,则将其插入 SwiftData。我收到了ModelContext
无法解决的错误。
以下代码是精简版,足以生成错误。我删除了测试现有项目的逻辑,直到我能解决这个问题。
抱歉,太长了:
import SwiftUI
import SwiftData
@Model
class TestData {
@Attribute(.unique) var id: String
var value: String
init(id: String, value: String) {
self.id = id
self.value = value
}
}
struct EditTestItem: View {
@Bindable var testData: TestData
var body: some View {
VStack {
HStack {
Text($testData.id)
TextField("Enter Data Here", text: $testData.value)
}
}
.modelContainer(for: TestData.self)
}
}
struct TestContent: View {
var testIDValue: String = ""
@Environment(\.modelContext) private var modelContext
@Query var testData: [TestData]
var testItem: TestData
init(testID: String) {
testItem = TestData(id: testID, value: "New value: \(testID)")
let _ = modelContext.insert(testItem)
do {
try modelContext.save()
} catch {
print("\(#line) oops")
}
}
var body: some View {
VStack {
VStack {
Text(testIDValue)
Text("\(testData.count)")
EditTestItem(testData: testItem)
}
Button("Save", action: {
try? modelContext.save()
})
}
.modelContainer(for: TestData.self)
.onAppear {
}
}
}
#Preview {
TestContent(testID: "b")
.modelContainer(for: TestData.self)
.frame(width: 400)
}
错误包括:
访问安装在视图之外的环境值。这将始终读取默认值并且不会更新。
和
在视图环境中设置 .modelContext 以使用查询
这肯定不是添加数据。
正确的做法是什么?
我将在 中创建测试对象,
onAppear
而不是使用init
。为了清楚起见,我们将所有相关代码放在一个函数中,该函数检查是否存在现有对象,如果不存在则创建一个新对象。
然后我们需要对视图做一些更改来保存 id 和对象并调用新函数
这是适合我并可用于
TestData
测试的测试代码。