我使用属性User
创建的核心数据id and name
,希望将其提取到列表中。
struct MyView: View {
@FetchRequest(entity: User.entity(), sortDescriptors: []) var users: FetchedResults<User>
var body: some View {
VStack {
List {
ForEach(users, id: \.id) { user in // Type '_' has no member 'id'
// Text(user.name)
}
}
}
}
}
我对错误报告感到困惑,似乎它无法成功导入核心数据实体。
更新
当我尝试在列表中使用name属性时,它还会报告Value of type 'NSManagedObject' has no member 'name'
错误消息。
ForEach(users, id: \.id) { user in
Text(user.name)
}
答案 0 :(得分:2)
有时,您需要构建项目以使实体在代码中得以识别。这是用于加载具有ID和名称的CoreData实体用户的代码。
struct ContentView: View {
@Environment(\.managedObjectContext) var context
@FetchRequest(entity: User.entity(), sortDescriptors: [])
var users: FetchedResults<User>
var body: some View {
List {
ForEach(users, id: \.id) { user in
Text("Id = \(user.id), Name = \(user.name ?? "")")
}
}
}
}
或者,您可以使User实体符合Identifiable。这样做可以跳过ForEach中的id参数。
extension User: Identifiable {
}
ForEach(users) { user in
Text("Id = \(user.id), Name = \(user.name ?? "")")
}
答案 1 :(得分:0)
参考此article,我创建了一个新的UserRow结构来保存核心数据实体,它对我来说正常工作。但是我认为在这种情况下我缺少一些知识,如果有人可以为我解释,那将非常好。
// in MyView add the new struct
struct UserRow: View {
var user: User
var body: some View {
Text(user.name ?? "No name given")
}
}
// then replace the list with
List {
ForEach(users) { user in
UserRow(user: user)
}
}