Core data 我可以在Picker()中使用@FetchRequest和@State变量吗?
我不知道如何将@State变量绑定到选择器,以便@FetchRequest更新 这段代码可以编译,但是更改选择器选择对fetchRequest没有任何作用,因为它不调用init。其他各种变种大多失败了 我如何做到这一点Core data 我可以在Picker()中使用@FetchRequest和@State变量吗?,core-data,swiftui,state,init,picker,Core Data,Swiftui,State,Init,Picker,我不知道如何将@State变量绑定到选择器,以便@FetchRequest更新 这段代码可以编译,但是更改选择器选择对fetchRequest没有任何作用,因为它不调用init。其他各种变种大多失败了 我如何做到这一点 struct ContentView: View { @Environment(\.managedObjectContext) private var viewContext @State private var selectedSkill
struct ContentView: View {
@Environment(\.managedObjectContext) private var viewContext
@State private var selectedSkill: Skill? = nil
@State private var pickerSelection: Int
@FetchRequest var skills: FetchedResults<Skill>
init(pickerSelection: Int) {
self._pickerSelection = State(initialValue: pickerSelection)
self._skills = FetchRequest(
entity: Skill.entity(),
sortDescriptors: [NSSortDescriptor(keyPath: \Skill.value, ascending: true)],
predicate: NSPredicate(format: "apparatus == %d", pickerSelection)
)
}
struct ContentView:View{
@环境(\.managedObjectContext)私有变量viewContext
@国家私有变量selectedSkill:Skill?=nil
@国家私有变量选择器选择:Int
@FetchRequest变量技能:FetchedResults
初始化(选择器选择:Int){
self.\u pickerSelection=状态(初始值:pickerSelection)
self.\u skills=FetchRequest(
实体:Skill.entity(),
SortDescriptor:[NSSortDescriptor(关键路径:\Skill.value,升序:true)],
谓词:NSPredicate(格式:“设备==%d”,选择器选择)
)
}
有几种方法可以实现这一点,这里是我的。我不确定你对技能的预期用途,但我认为你可以找到如何让它为你工作的方法
我会让仪器成为一个enum
enum Apparatus: Int, CaseIterable, CustomStringConvertible, Identifiable {
case vault, unevenBars, balanceBeam, all
var id: String { self.description }
var description: String {
switch self {
case .vault: return "Vault"
case .unevenBars: return "Uneven Bars"
case .balanceBeam: return "Balance Beam"
case .all: return "All"
}
}
}
扩展项目
extension Item {
var unwrappedApparatus: Apparatus {
Apparatus(rawValue: Int(apparatus)) ?? Apparatus.vault
}
var unwrappedName: String {
name ?? "Unknown"
}
}
在ContentView
struct ContentView: View {
@Environment(\.managedObjectContext) private var viewContext
@State var selectedApparatus = Apparatus.vault
var body: some View {
List {
Picker("Apparatus", selection: $selectedApparatus) {
Text("Vault").tag(Apparatus.vault)
Text("Uneven Bars").tag(Apparatus.unevenBars)
Text("Balance Beam").tag(Apparatus.balanceBeam)
Text("All").tag(Apparatus.all)
}
Text(selectedApparatus.description)
ItemsView(selectedApparatus: $selectedApparatus) // <-- View changing on selectedApparatus
}
}
}
struct ItemsView: View {
@FetchRequest private var items: FetchedResults<Item>
init(selectedApparatus: Binding<Apparatus>) {
self._items = FetchRequest(entity: Item.entity(),
sortDescriptors: [NSSortDescriptor(keyPath: \Item.name, ascending: true)],
predicate: selectedApparatus.wrappedValue == .all ? nil : NSPredicate(format: "apparatus == %d", selectedApparatus.wrappedValue.rawValue))
}
var body: some View {
ForEach(items) { item in
Text(item.unwrappedName)
}
}
}