SwiftUI和Core Data:根据用户输入进行提取

时间:2019-11-06 16:33:28

标签: core-data swiftui

我正在努力寻找一种非常简单的模式,我希望朝着正确的方向发展。简而言之:我想从主视图(列表)导航到详细信息视图(列表),在该视图中,在主列表中点击的行会导致获取核心数据以填充详细信息列表。例如:

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”的Vehicle对象,然后使用这些Vehicle填充详细视图列表。我知道如何使用必要的谓词执行获取,但是我无法弄清楚何时点击行时何时进行获取,或者如何将获取结果获取到详细信息视图。

编辑:为了明确起见,我想避免使用ContentView预先提取所有Vehicles,然后仅根据所选品牌对其进行过滤的模式。相反,我希望在用户点击一行后动态进行获取。

2 个答案:

答案 0 :(得分:1)

我认为最好的方法是让DetailView进行提取,只需将选定的行传递到DetailView并使其完成工作,您可以将提取内容放入{{ 1}} init或更好地将其放置在模型的init中。

但是,如果没有与所选行匹配的数据,也许您不想执行导航(在DetailView中显示一个空列表会有些丑陋),在这种情况下,您必须将提取内容放入MasterView中建模并在按下一行时调用它,请参阅我今天早些时候在这里https://stackoverflow.com/a/58723514/10208552给出的答案,基本上,您将点击一个按钮,该按钮将触发获取操作并触发导航

答案 1 :(得分:0)

通过简单的struct参数将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>

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