【发布时间】:2019-12-22 08:57:56
【问题描述】:
我正在尝试构建一个示例 BBQ 应用程序来学习 SwiftUI(XCode 11 beta 5),并且无法弄清楚如何从来自 Core Data 的对象列表视图导航到对象的详细视图。 Xcode 没什么用,主要是根据我的尝试弹出不相关的错误。
我已尽我的逻辑能力尝试应用状态、绑定、可观察对象等,但未能破解它。
这是我的列表视图,它构建得很好,并允许我导航到目的地(这只是一个包含 id 属性作为字符串的视图):
struct CookListView: View {
@ObservedObject var cookListVM: CookListViewModel
@State var cookCreatorVM = CookCreatorViewModel()
init() {
cookListVM = CookListViewModel()
}
var body: some View {
NavigationView {
List {
ForEach(cookListVM.cooks, id: \.id) { cook in
NavigationLink(destination: Text("\(cook.id)")) {
VStack {
Text(cook.protein)
}
}
}
}.navigationBarTitle("BBQ")
}
}
}
但如果我像这样更改我的 NavigationLink 目的地:
NavigationView {
List {
ForEach(cookListVM.cooks, id: \.id) { cook in
NavigationLink(destination: CookDetailView(cook: cook)) {
VStack {
Text(cook.protein)
}
}
}
}
}
Xcode 将不再构建项目。它给我的错误似乎有些不相关,例如 ForEach 行上的 Type '_' has no member 'id',或者如果我从 ForEach 中删除 , id: \.id(由于 Identifiable 我真的不需要),我会得到 Type of expression is ambiguous without more context on Text(cook.protein) 行。
如果我使用硬编码数组,它会构建并且可以很好地导航。仅当我尝试使用 Core Data 时才会出现此问题。
我的CookDetailView 看起来像这样:
struct CookDetailView: View {
var cook: Cook
var body: some View {
VStack {
Text("\(cook.protein!)")
}
}
}
Cook 对象本身的模型如下所示:
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 文件设置的。
如果有帮助的话,我非常乐意添加任何额外/省略的代码,例如我如何写入/读取核心数据。
【问题讨论】:
-
我认为这不是与 CoreData 相关的问题,但为了让我们复制粘贴您的示例并尝试找出问题,我们需要所有代码作为最小可行示例.例如:缺少 Cook 类,我无法真正复制您的代码并尝试调试它。
-
cook.protein是可选的吗?您可以将{ cook in替换为{ (cook: CookType) in。从标签周围移除VStack。如果两个参数之一是标签,它更有可能起作用。如果您尝试传入绑定,它可能会变得更加复杂。特别是如果它由计算数组支持的话..但我们不要讨论这个。哦,你可以添加cook.protein作为第一个未命名的参数,这更有可能工作,同时删除尾随闭包。耶。 SwiftUI! -
由于我们看不到您的其余代码,请看一下这个项目。它是完整的,可以在 Beta 5 上编译和运行。它可能会给您一些关于项目方向的想法。 github.com/Whiffer/SwiftUI-Core-Data-Test