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 在 DetailView 中绑定 TextFields
SwiftUI:Core Data @FetchRequest 和 List 显示托管对象 - 在 lockscreemn 上丢失数据