Core data SwiftUI和核心数据:基于用户输入获取

Core data SwiftUI和核心数据:基于用户输入获取,core-data,swiftui,Core Data,Swiftui,我怀疑这是一个非常简单的模式,我很想知道正确的方向。简而言之:我想从主视图(列表)导航到详细视图(列表),在主列表中点击的行会导致核心数据提取填充详细列表。例如: struct ContentView: View { let makes = ["GMC", "Ford", "Chevy"] var body: some View { NavigationView { List(self.makes, id: \.self) { make

我怀疑这是一个非常简单的模式,我很想知道正确的方向。简而言之:我想从主视图(列表)导航到详细视图(列表),在主列表中点击的行会导致核心数据提取填充详细列表。例如:

struct ContentView: View {
    let makes = ["GMC", "Ford", "Chevy"]

    var body: some View {
        NavigationView {
            List(self.makes, id: \.self) { make in
                NavigationLink(destination: DetailView()) {
                  Text(make)
                } //NavigationLink
            } //List
        } //NavigationView
    } //body
} //ContentView
因此,如果用户点击标记为“Chevy”的行,我希望执行核心数据获取,返回make==“Chevy”的所有车辆对象,然后使用这些车辆填充详细视图列表。我知道如何使用必要的谓词执行提取,但我不知道在点击行时何时/何地进行提取,或者如何将提取结果获取到详细视图


编辑:为了澄清这一点,我希望避免ContentView预先获取所有车辆,然后根据所选品牌对其进行过滤的模式。相反,我希望在用户点击一行后动态地进行提取。

我认为最好的方法是让
DetailView
进行提取,只需将所选行传递给
DetailView
并让它完成它的工作,您可以将抓取放在
DetailView
init中,或者最好将其放在模型的init中


但是,如果没有与所选行匹配的数据,您可能不想执行导航(在DetailView中显示空列表会有点难看),在这种情况下,您必须将抓取放在MasterView模型中,并在按下一行时调用它,请参见我今天早些时候给出的答案,基本上,您将点击一个按钮,该按钮将触发抓取,该按钮将触发导航

我认为最好的方法是让
详细视图
进行抓取,只需将所选行传递给
详细视图
,然后让它完成它的工作,您可以将抓取放在
DetailView
init中,或者最好将其放在模型的init中


但是,如果没有与所选行匹配的数据,您可能不想执行导航(在DetailView中显示空列表会有点难看),在这种情况下,您必须将抓取放在MasterView模型中,并在按下一行时调用它,请参见我今天早些时候给出的答案,基本上,您将点击一个按钮,该按钮将触发抓取,从而触发导航

通过一个简单的结构参数将make传递给您的第二个视图,例如:

NavigationLink(destination: DetailView(make: make))
您的
DetailView
只需要
make
参数:

struct DetailView: some View {
    var make: String
}
然后使用一个断言的获取请求,如下所示:

 @FetchRequest(
    entity: Vehicle.entity(),
    sortDescriptors: [
        NSSortDescriptor(key: "model", ascending: true),
    ],
    predicate: NSPredicate(format: "make == %@", self.make)
) var vehicles: FetchedResults<Vehicle>
@FetchRequest(
实体:Vehicle.entity(),
sortDescriptors:[
NSSortDescriptor(键:“模型”,升序:true),
],
谓词:NSPredicate(格式:“make=%@”,self.make)
)var车辆:获取结果

请注意,此代码未经测试,但这将使您走上正确的道路。

通过简单的结构参数将make传递给第二个视图,例如:

NavigationLink(destination: DetailView(make: make))
您的
DetailView
只需要
make
参数:

struct DetailView: some View {
    var make: String
}
然后使用一个断言的获取请求,如下所示:

 @FetchRequest(
    entity: Vehicle.entity(),
    sortDescriptors: [
        NSSortDescriptor(key: "model", ascending: true),
    ],
    predicate: NSPredicate(format: "make == %@", self.make)
) var vehicles: FetchedResults<Vehicle>
@FetchRequest(
实体:Vehicle.entity(),
sortDescriptors:[
NSSortDescriptor(键:“模型”,升序:true),
],
谓词:NSPredicate(格式:“make=%@”,self.make)
)var车辆:获取结果

请注意,此代码未经测试,但这将使您走上正确的道路。

谢谢kdion:我尝试了一下,但Xcode不喜欢@FetchRequest中对“self.make”的引用。“无法在属性初始值设定项中使用实例成员‘make’;属性初始值设定项在‘self’可用之前运行。”这不起作用,因为未初始化self时您不能使用它。在init()方法中执行fetch请求谢谢kdion:我尝试了一下,但是Xcode不喜欢@FetchRequest中对“self.make”的引用。“无法在属性初始值设定项中使用实例成员‘make’;属性初始值设定项在‘self’可用之前运行。”这不起作用,因为未初始化self时您不能使用它。在init()方法中执行fetch请求谢谢,Sorin:这帮助我找到了一个解决方案。不幸的是,我不知道如何在DetailView的init中进行抓取。但后来我意识到,我可以在DetailView的主体变量中,在名为List参数的函数中进行抓取。当从列表的.onAppear.@protasm调用时,它似乎也能工作。您能分享一下您的解决方案吗?谢谢汉克斯,索林:这帮我找到了解决办法。不幸的是,我不知道如何在DetailView的init中进行抓取。但后来我意识到,我可以在DetailView的主体变量中,在名为List参数的函数中进行抓取。当从列表的.onAppear.@protasm调用时,它似乎也能工作。您能分享一下您的解决方案吗?谢谢