gpt4 book ai didi

core-data - 使用核心数据导航到 SwiftUI 中的详细 View

转载 作者:行者123 更新时间:2023-12-04 15:42:05 26 4
gpt4 key购买 nike

我正在尝试构建一个示例 BBQ 应用程序来学习 SwiftUI(XCode 11 beta 5),但一直无法弄清楚如何从来自 Core Data 的对象 ListView 导航到对象的详细信息 View 。 Xcode 没有帮助,主要是根据我的尝试弹出不相关的错误。

我已尽我最大的逻辑能力尝试应用状态、绑定(bind)、可观察对象等,但未能破解它。

这是我的 ListView ,它构建得很好,并允许我导航到目的地(它只是一个包含 id 属性作为字符串的 View ):

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',或者如果我删除 , id:\.id从 ForEach(由于 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 文件设置的。

如果有帮助,我非常乐意添加任何额外/省略的代码,例如我如何写入/读取核心数据。

最佳答案

我完全可以理解您对 Xcode 错误消息的不满。实际错误通常离错误消息很远。 [建议:使用源代码管理并在每次干净编译后提交 ;-)] 您在 ListView 中遇到的错误是因为您在详细 View 的参数列表中指定了错误的类型。尝试以下操作:

struct CookDetailView: View {

var cook: CookViewModel

var body: some View {
VStack {
Text("\(cook.name)")
}
}
}

顺便说一句,由于您正在获取一个数组,除非您手动发布它们,否则您不会观察到该数组中的更改。我放弃了让我的 NSManagedObject 子类发布它们自己的更改的尝试。有两种方法可以解决这个问题。您可以从 NSFetchedResultsControllercontrollerDidChangeContent 委托(delegate)调用 objectWillChange 或者您可以在观察 NSManagedObjectContextDidSave 通知时执行相同的操作使用获取的结果 Controller 。

此答案适用于 Beta 5。在未来的 Beta 中情况肯定会发生变化。

关于core-data - 使用核心数据导航到 SwiftUI 中的详细 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57517778/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com