ios - 预览因核心数据查找而失败,但在 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 中编译。我对这个想法和下一步感到茫然,并希望得到任何提示/ 建议。
解决方案
这是使用 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 的常见问题。
推荐阅读
- python - Pandas:按 ID 变量分组并过滤掉日期时间行
- vhdl - 端口映射时的 VHDL 未定义值
- java - 在 Java 中从整数转换为二进制时保留整个字节
- java - 为什么即使我的条件之一错误,我的函数也会返回 true?
- macos - 是否可以仅使用简单的配置文件以非 root 用户身份运行 httpd?
- powerbi - 从多个 pdf 表单中提取数据,转换为 PBI/PQ 的可行格式?
- node.js - MongoDB Node.JS insertOne 错误:“类型 'string' 不可分配给类型 'ObjectId | undefined”
- bash - 使用 bash 选择大于 0 且小于 4 的整数
- vuejs3 - 使用 Auth0 作为第三方访问提供者时,Fauna 返回“未经授权”
- mysql - 将嵌套关系作为列加入