预览因核心数据查找而失败,但在 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 而失败
命令 PhaseScriptExecution 因 R.swift 的非零退出代码而失败
带有 Java 14 的 IntelliJ 2020.1 中的“记录”预览功能在 Maven“安装”期间因编译器错误而失败,但以其他方式运行