【问题标题】:Fetch core data entity in list获取列表中的核心数据实体
【发布时间】:2020-03-12 02:31:36
【问题描述】:

我使用属性id and name 创建的核心数据User,我想将其提取到列表中。

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

我对错误报告感到困惑,似乎没有成功导入核心数据实体。

更新

当我尝试使用 list 中的 name 属性时,它也会报 Value of type 'NSManagedObject' has no member 'name' 错误信息。

ForEach(users, id: \.id) { user in
    Text(user.name)
}

【问题讨论】:

    标签: ios swift core-data swiftui


    【解决方案1】:

    有时,您需要为要在代码中识别的实体构建项目。下面是使用 id 和 name 加载 CoreData 实体 User 的代码。

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

    【讨论】:

    • 您使用的是哪个版本的 XCode?​​span>
    • 版本 11.3.1。
    • 我使用的是相同的版本,我没有看到任何错误。您确定您为 User 实体创建了具有适当类型的名称和 id 属性吗?我已经用我的实体的屏幕截图更新了答案。
    【解决方案2】:

    引用这个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)
        }
    }
    

    【讨论】:

    • 请发布一个新问题。如果这段代码对你有用,你认为你缺少什么?
    • 我想为什么我们需要创建一个struct来反映到核心数据实体,是否可以直接使用实体?
    • 你指的是哪个结构?你想在哪里直接使用实体?
    • 必须创建结构体var user: User 来保存var users: FetchedResults&lt;User&gt;
    • 我似乎不明白你的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    相关资源
    最近更新 更多