我需要一些有关 SwiftData 的帮助。我希望仅在应用程序第一次打开时创建我的 SwiftData 类之一的一些实例。这些实例应在应用程序首次打开时创建一次,而不是在后续启动时创建。我尝试过对它们进行硬编码,但 SwiftData 给我带来了这种方法的问题。 SwiftData 似乎需要由应用程序本身创建实例,而不是硬编码。是否有正确的方法仅在第一次应用程序启动时初始化这些实例?
我是初学者,非常感谢任何帮助。谢谢!
这是 Swift-Data-Class 的示例:
@Model
class TexEmoji {
let id: UUID
var text: String
var emoji: String
init(text: String, emoji: String) {
self.id = UUID()
self.text = text
self.emoji = emoji
}
}
这是我为@main App 尝试的代码
@main
struct PersonalAdviceApp: App {
@Environment(\.modelContext) private var context
func checkFirstLaunch() {
let hasLaunchedBefore = UserDefaults.standard.bool(forKey: "hasLaunchedBefore")
if !hasLaunchedBefore {
let instance1: TexEmoji = TexEmoji(text: "Standard-Text 1", emoji: "😃")
context.insert(instance1)
let instance2: TexEmoji = TexEmoji(text: "Home-Page", emoji: "🏠")
context.insert(instance2)
UserDefaults.standard.set(true, forKey: "hasLaunchedBefore")
}
}
var body: some Scene {
WindowGroup {
TestPage()
.modelContainer(for: [Ergebnis.self, Seite.self, TexEmoji.self])
.onAppear {checkFirstLaunch()}
}
}
}
不幸的是我总是收到以下错误:
*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“无法在此托管对象上下文中插入“TexEmoji”,因为在关联的托管对象模型中找不到它。”
让 ModelContainer 成为应用程序结构中的一个属性,并在其声明中进行设置
var sharedModelContainer: ModelContainer = {
let schema = Schema([
Ergebnis.self, Seite.self, TexEmoji.self
])
let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false)
do {
let container = try ModelContainer(for: schema, configurations: [modelConfiguration])
checkFirstLaunch(context: container.mainContext)
return container
} catch {
fatalError("Could not create ModelContainer: \(error)")
}
}()
通过此设置,我建议在 checkFirstLaunch 结束时在模型上下文上调用 save() 。
然后您需要更改场景主体属性中的修改器
.modelContainer(sharedModelContainer)