Core data 使用核心数据导航到SwiftUI中的详细视图
我正在尝试构建一个示例BBQ应用程序来学习SwiftUI(XCode 11 beta 5),但我无法理解如何从核心数据中的对象列表视图导航到对象的详细视图。Xcode没有任何帮助,主要是根据我的尝试弹出不相关的错误 我已经尽我最大的逻辑能力尝试应用状态、绑定、可观察对象等,但一直未能破解它 这是我的列表视图,它构建得很好,允许我导航到目的地(这只是一个以字符串形式包含Core data 使用核心数据导航到SwiftUI中的详细视图,core-data,swiftui,Core Data,Swiftui,我正在尝试构建一个示例BBQ应用程序来学习SwiftUI(XCode 11 beta 5),但我无法理解如何从核心数据中的对象列表视图导航到对象的详细视图。Xcode没有任何帮助,主要是根据我的尝试弹出不相关的错误 我已经尽我最大的逻辑能力尝试应用状态、绑定、可观察对象等,但一直未能破解它 这是我的列表视图,它构建得很好,允许我导航到目的地(这只是一个以字符串形式包含id属性的视图): 但是如果我这样更改我的NavigationLink目的地: NavigationView { List
id
属性的视图):
但是如果我这样更改我的NavigationLink目的地:
NavigationView {
List {
ForEach(cookListVM.cooks, id: \.id) { cook in
NavigationLink(destination: CookDetailView(cook: cook)) {
VStack {
Text(cook.protein)
}
}
}
}
}
Xcode将不再生成该项目。它给我的错误似乎有些不相关,例如,Type'.'在ForEach行上没有成员'id'
,或者如果我从ForEach中删除,id:\.id
(由于可识别性,我实际上不需要它),我将得到表达式类型是不明确的,在文本(cook.protein)
行上没有更多上下文
如果我使用一个硬编码的数组,它就可以构建并很好地导航。只有当我试图使用核心数据时,问题才会出现
我的CookDetailView
如下所示:
struct CookDetailView: View {
var cook: Cook
var body: some View {
VStack {
Text("\(cook.protein!)")
}
}
}
class CookViewModel: ObservableObject, Identifiable {
var protein: String = ""
var type: String = ""
var id: UUID = UUID()
init(cook: Cook){
self.protein = cook.protein!
self.type = cook.type!
self.id = UUID()
}
}
Cook
对象本身的模型如下所示:
struct CookDetailView: View {
var cook: Cook
var body: some View {
VStack {
Text("\(cook.protein!)")
}
}
}
class CookViewModel: ObservableObject, Identifiable {
var protein: String = ""
var type: String = ""
var id: UUID = UUID()
init(cook: Cook){
self.protein = cook.protein!
self.type = cook.type!
self.id = UUID()
}
}
它还通过.xcdatamodeld文件进行了设置
我非常乐意添加任何附加/省略的代码,例如我如何写入/读取核心数据,如果这有帮助的话。我完全可以理解您对Xcode错误消息的失望。实际错误通常与错误消息相差甚远。[Sug:在每次干净编译后使用源代码管理和提交;-)]列表视图中出现的错误是因为在详细信息视图的参数列表中指定了错误的类型。请尝试以下操作:
struct CookDetailView: View {
var cook: CookViewModel
var body: some View {
VStack {
Text("\(cook.name)")
}
}
}
顺便说一句,由于您正在获取一个数组,因此除非手动发布更改,否则您将无法观察该数组中的更改。我放弃了让我的NSManagedObject
子类发布自己的更改。有两种方法可以解决这个问题。您可以从NSFetchedResultsController
的controllerdChangeContent
委托调用objectWillChange
,也可以在不使用获取的结果控制器时观察NSManagedObjectContextDidSave
通知时执行相同的操作
这个答案适用于Beta 5。在未来的Beta中,情况肯定会发生变化。我不认为这是与CoreData相关的问题,但为了让我们复制粘贴您的示例并尝试解决问题,我们需要所有代码作为最低可行的示例。例如:Cook.protein
是可选的吗?您可以将{cook in
替换为{(cook:CookType)在
中。从标签周围移除VStack
。如果两个参数中的一个是标签,则更可能工作。如果尝试传入绑定,则可能会变得更复杂。特别是如果它由计算数组支持。但我们不必深入讨论。哦,您可以添加cook.protein
作为第一个未命名的参数,这个mor我们很可能会工作,同时删除c.Yay.SwiftUI的后续闭包!因为我们看不到您的其余代码,请看一下这个项目。它是完整的,编译并在Beta 5上运行。它可能会给您一些关于项目方向的想法。解决了它!您不会相信我在这个问题上花了多长时间。比关于解决方案、示例项目和技巧,已经讲了很多了——这些都非常有用。