我正在尝试构建一个例子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我不是真正需要它),我将在Text(cook.protein)行上得到“Type of expression is ambiguous without more context”的错误。
如果我使用硬编码数组,它会构建并可以完美地导航。只有在我尝试使用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文件进行设置。
如果有帮助的话,我很乐意添加任何额外/遗漏的代码,例如如何写入/读取核心数据。
cook.protein
是可选的吗?您可以将{ cook in
替换为{ (cook: CookType) in
。从标签周围删除VStack
。如果两个参数中有一个是 Label,则更有可能起作用。如果尝试传递绑定,可能会变得更加复杂。特别是如果它由计算数组支持...但我们不要深入讨论。哦,您可以将cook.protein
添加为第一个未命名参数,这更有可能起作用,同时删除尾随闭包。耶。SwiftUI! - Fabian