预览因核心数据查找而失败,但在 Swift 5 / Core Data / FetchRequest 中使用随机值

Posted

技术标签:

【中文标题】预览因核心数据查找而失败,但在 Swift 5 / Core Data / FetchRequest 中使用随机值【英文标题】:Preview fails with core data lookup but works with random value in Swift 5 / Core Data / FetchRequest 【发布时间】:2020-11-11 21:58:15 【问题描述】:

我正在尝试进行临时预览,但遇到了一个不寻常的问题。我有一个视图,它通过单击进入子视图的列表项的 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 中编译。我对这个想法和下一步感到茫然,并希望得到任何提示/ 建议。

【问题讨论】:

【参考方案1】:

这是使用 Core Data 的令人沮丧的部分之一,并且缺乏清晰的文档。我使用这个 SO Q&A 中的一些提示来解决这个问题:How to fill TextField with data from Core Data and update changes?

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

ViewList(item: item)

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

在详细视图中,我需要将此项声明为核心数据实体,如下所示:

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 的常见问题。

【讨论】:

以上是关于预览因核心数据查找而失败,但在 Swift 5 / Core Data / FetchRequest 中使用随机值的主要内容,如果未能解决你的问题,请参考以下文章

核心数据 executeFetchRequest 因 exc_bad_access 而失败

Alamofire Swift-2.0 分支因错误而失败

Swift 命令因信号而失败:分段错误

命令 PhaseScriptExecution 因 R.swift 的非零退出代码而失败

Swift 编译器错误命令因信号而失败:分段错误:11

带有 Java 14 的 IntelliJ 2020.1 中的“记录”预览功能在 Maven“安装”期间因编译器错误而失败,但以其他方式运行