我正在尝试在我的 Xcode 项目 (SwiftUI) 中使用 CoreData。我创建了一个 Player 实体并想在名为“YouView”的视图中使用它。但是当我试图获取数据时,我从 Title 中得到了错误。我的应用程序称为 Dart 工具。我的应用程序语言是德语,所以如果您不了解 ui 的所有内容,请不要担心 :)。
感谢您的帮助!
我已经尝试过 .shared 变体 - 同样的错误
这是我的 DataController 文件的代码:
import Foundation
import CoreData
class DataController: ObservableObject {
let container = NSPersistentContainer(name: "DataModel")
init() {
container.loadPersistentStores { desc, error in
if let error = error {
print("Daten wurden nicht geladen: \(error.localizedDescription)")
}
}
}
func save(context: NSManagedObjectContext) {
do {
try context.save()
print("Daten wurden gespiechert!")
} catch {
print("Daten konnten nicht gespeichert werden.")
}
}
func addPlayer(name: String, isUser: Bool, context: NSManagedObjectContext) {
let player = Player(context: context)
player.id = UUID()
player.name = name
player.isUser = isUser
save(context: context)
}
func editPlayerName(player: Player, name: String, context: NSManagedObjectContext) {
player.name = name
save(context: context)
}
}
这是我的 DartToolsApp.swift 文件:
import SwiftUI
//The error is here:
@main
struct DartToolsApp: App {
@StateObject private var userDefaults = UserDefaults()
@StateObject private var dataController = DataController()
var body: some Scene {
WindowGroup {
ContentView()
.environment(\.managedObjectContext, DataController().container.viewContext)
.environmentObject(UserDefaults())
}
}
}
这是我要使用数据的文件:
顺便说一句,这个视图是 TabView 的一部分。
import SwiftUI
import CoreData
struct YouView: View {
@EnvironmentObject var userDefaults: UserDefaults
// I guess the error is because of this line:
@FetchRequest(sortDescriptors: []) var players: FetchedResults<Player>
@Environment(\.managedObjectContext) var managedObjectContext
var body: some View {
NavigationStack {
Form {
}
.navigationTitle("\(findUser()) (Du)")
}
}
func findUser() -> String {
if let index = players.firstIndex(where: { $0.isUser }) {
let output = players[index].name!
return output
}
else {
return ""
}
}
}
这是创建用户的代码:
DataController().addPlayer(name: nameText, isUser: true, context: managedObjectContext)
哇,那是很多代码。我希望你能帮助我!
您正在到处创建 DataController
的新实例,这本身就是一个问题,但是当您分配 \.managedObjectContext
环境变量时,认为导致您的特定错误的原因是。
因此,与其创建新实例,不如使用您的 @StateObject
实例。
所以在 App 代码中改变这个
var body: some Scene {
WindowGroup {
ContentView()
.environment(\.managedObjectContext, dataController.container.viewContext)
}
}
首先删除
@StateObject private var userDefaults = UserDefaults()
@StateObject private var dataController = DataController()
因为两者都将被注入环境中。
而不是视图上下文,将数据控制器注入环境
.environmentObject(DataController())
其次使用always环境变量。每次调用 DataController()
都会创建一个新的、不同的实例。
在创建新用户的视图中添加
@EnvironmentObject var dataController: DataController
并在这个实例上调用 addPlayer
。由于上下文是数据控制器的一部分,因此参数是多余的
dataController.addPlayer(name: nameText, isUser: true)
在DataController
添加一个属性managedObjectContext
lazy var managedObjectContext : NSManagedObjectContext = { return self. container.viewContext }()
并将方法 addPlayer
更改为
func addPlayer(name: String, isUser: Bool) {
let player = Player(context: managedObjectContext)
player.id = UUID()
player.name = name
player.isUser = isUser
save(context: managedObjectContext)
}