Core data 我可以在Picker()中使用@FetchRequest和@State变量吗?

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

我不知道如何将@State变量绑定到选择器,以便@FetchRequest更新

这段代码可以编译,但是更改选择器选择对fetchRequest没有任何作用,因为它不调用init。其他各种变种大多失败了

我如何做到这一点

    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)
    }
  }
}