首页 > 解决方案 > 预览因核心数据查找而失败,但在 Swift 5 / Core Data / FetchRequest 中使用随机值

问题描述

我正在尝试进行临时预览,但遇到了一个不寻常的问题。我有一个视图,它通过单击进入子视图的列表项的 UUID。子视图使用此项目来填充相关项目。当我发送一个随机生成的 UUID 时,代码可以工作,但显然没有填充任何内容,因为该随机 UUID 与子对象无关。我写了一个@FetchRequest 来提取核心数据并分配一个真实的 UUID,它在预览提供程序中被称为静态函数。当我这样做时,预览不会编译 - 不会产生任何错误。这是代码:

struct ViewList_Previews: PreviewProvider {
@FetchRequest(
    entity: Item.entity(),
    sortDescriptors: [NSSortDescriptor(keyPath: \Item.userOrder, ascending: true)],
    animation: .default)
private static var items: FetchedResults<Item>

static func assignUUID() -> UUID {
    var tempID = UUID()
    for item in items {
        tempID = item.id!
    }
    print (tempID)
    return tempID
}

static var previews: some View {
    
    ViewList(listID: UUID())
}
}

我用 ViewList(listID:assignUUID()) 替换了 ViewList(listID: UUID()),但那是预览失败的时候。

必须有更好的方法来做到这一点。我根本不必调用此函数,而是获取一条记录,然后导航到该第一条记录的 item.id,将其设置为一个值,然后在 ViewList 拉取中使用它。我已经搜索了整个互联网(真的,只是这样)并找到了旧版本 Swift 的代码,但没有一个在 Swift 5 中编译。我对这个想法和下一步感到茫然,并希望得到任何提示/ 建议。

标签: iosswiftcore-data

解决方案


这是使用 Core Data 的令人沮丧的部分之一,并且缺乏清晰的文档。我使用这个 SO Q&A 中的一些提示来解决这个问题:如何用 Core Data 中的数据填充 TextField 并更新更改?

我的错误从主视图开始,我错误地使用 NavigationLink 来调用详细视图。我应该使用以下方法调用 Core Data 对象的详细视图:

ViewList(item: item)

其中 item 是 @FetchRequest 对象的单个成员“items”。这是通过 ForEach 循环迭代的。

在详细视图中,我需要将此项声明为 Core Data 实体,如下所示:

var item: Item

其中 Item 是我创建的核心数据实体。

我无法让预览按预期工作,但以下代码可以防止它崩溃:

struct ViewList_Previews: PreviewProvider {
@Environment(\.managedObjectContext) private static var viewContext

static var previews: some View {

    let sampleItem = Item.init(context: viewContext)
    ViewList(item: sampleItem)
        .environmentObject(Item())
}
}

我认为 sampleItem = Item.init 会在实体中显示初始项目,但显然这似乎不起作用。我希望有人能回答这部分问题。我希望早期的解释能帮助其他有类似问题的人——这似乎是关于 SO 的常见问题。


推荐阅读