获取列表中的核心数据实体

时间:2020-03-12 02:31:36

标签: ios swift core-data swiftui

我使用属性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)
}

2 个答案:

答案 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 ?? "")")
}

User entity setup

答案 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)
    }
}