SwiftUI 和 Core Data:基于用户输入获取

Posted

技术标签:

【中文标题】SwiftUI 和 Core Data:基于用户输入获取【英文标题】:SwiftUI and Core Data: fetch based on user input 【发布时间】:2019-11-06 16:33:28 【问题描述】:

我正在为我怀疑是一个非常简单的模式而苦苦挣扎,我希望能指出正确的方向。简而言之:我想从主视图(列表)导航到详细视图(列表),在主列表中点击的行会导致核心数据获取填充详细列表。例如:

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

谢谢,Sorin:这帮助我找到了解决方案。不幸的是,我无法弄清楚如何在 DetailView 的 init 中进行获取。但后来我意识到我可以在 DetailView 的主体 var 中调用一个作为 List 参数的函数进行获取。从列表的 .onAppear 调用时,它似乎也可以工作。 @protasm 你能分享你的解决方案吗?谢谢【参考方案2】:

通过一个简单的结构参数例如:

将 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>

请注意,此代码未经测试,但这应该能让您走上正确的道路。

【讨论】:

感谢 kdion:我试了一下,但 Xcode 不喜欢 @FetchRequest 中对“self.make”的引用。 “不能在属性初始化器中使用实例成员 'make';属性初始化器在 'self' 可用之前运行。” 这不起作用,因为您在未初始化时无法使用 self。在 init() 方法中执行 fetch 请求

以上是关于SwiftUI 和 Core Data:基于用户输入获取的主要内容,如果未能解决你的问题,请参考以下文章

Swift之深入解析如何结合Core Data和SwiftUI

使用 SwiftUI 2.0 和 Core Data 预填充数据

SwiftUI 将 Core Data 实体读入 []

SwiftUI Core Data 在 DetailView 中绑定 TextFields

SwiftUI:Core Data @FetchRequest 和 List 显示托管对象 - 在 lockscreemn 上丢失数据

SwiftUI Core Data 删除实体的相关数据