SwiftUI Пытается получить объект из FetchedResults, но не находит пути - PullRequest
0 голосов
/ 07 мая 2020

У меня есть список FetchedResults, и я выбираю объект из этого FetchedResults с помощью Picker, но не знаю, как сохранить этот объект. Я получаю список объектов из сущности CoreData через FetchedRequest в переменной listOfPolymers. Теперь я хочу выбрать один объект в качестве родительского семейства, но я не могу найти способ, как выбрать выбранный объект из Picker. Если я использую тип объекта в средстве выбора, он выдает ошибку, поскольку объект привязки должен быть передан из представления, из которого я перехожу к этому представлению, но у меня нет возможности передать этот объект из этого представления. Вот мой код:

struct Polymer: View {
@Environment(\.managedObjectContext) var mocPolymer
@FetchRequest(entity: AECPolymer.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \AECPolymer.name, ascending: true)]) var listOfPolymers: FetchedResults<AECPolymer>
@State var toAddPolymerName: String = ""
@State var toAddPolymerShortName: String = ""
@State var addPolymer: Bool = false
@State var parentPolymerName: String = "Select"
@State var hasParent: Bool = false

var body: some View {
    List {
        if addPolymer {
            Section(header: Text("Add Polymer")) {
                TextField("Name", text: $toAddPolymerName)
                TextField("Short Name", text: $toAddPolymerShortName)
                Toggle(isOn: $hasParent) {
                    Text("Belongs to a Parent Polymer Family?")
                }
                VStack {
                    if hasParent {
                        Picker(selection: $parentPolymerName, label: EmptyView()) {
                        ForEach(listOfPolymers, id: \.self) {(parent: AECPolymer) in
                            Text(parent.name ?? "Unknown")
                        }
                        }
                    } else {
                        EmptyView()
                    }
                }
                if self.toAddPolymerName.isEmpty || self.toAddPolymerShortName.isEmpty {
                    EmptyView()
                } else {
                    Button(action: {
                        let toAddPolymer = AECPolymer(context: self.mocPolymer)
                        toAddPolymer.name = self.toAddPolymerName
                        toAddPolymer.shortName = self.toAddPolymerShortName
                        let selectedParentPolymerName = self.parentPolymerName
                        if let parentPolymer = self.listOfPolymers.first(where: { "name == @%", selectedParentPolymerName }) {
                            toAddPolymer.polymerFamily = parentPolymer
                        }

                        do {
                            try self.mocPolymer.save()
                        } catch {
                            let nserror = error as NSError
                            fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
                        }
                        self.toAddPolymerName = ""
                        self.toAddPolymerShortName = ""
                        self.addPolymer.toggle()
                    }, label: {
                        Text("Save")
                    }).buttonStyle(BorderlessButtonStyle())
                }
            }
        } else {
            EmptyView()
        }
        Section(header: Text("Polymers")) {
            if self.listOfPolymers.count != 0 {
                ForEach(listOfPolymers, id: \.self) {(polymer: AECPolymer) in
                    VStack(alignment: .leading) {
                        Text(polymer.name ?? "Unknown")
                        Text("(\(polymer.shortName ?? "Unknown"))").font(.footnote)
                    }
                }
            } else {
                Text("List is empty...")
            }
        }
    }.navigationBarTitle("List")
        .navigationBarItems(trailing: Button(action: {
            self.addPolymer.toggle()
        }, label: {
            if self.addPolymer {
                Text("Cancel")
            } else {
                Image(systemName: "plus.circle.fill")
                    .imageScale(.large)
            }
        }))
}

}

может кто-нибудь помочь, как мне получить объект, который пользователь выбирает из сборщика ...

1 Ответ

0 голосов
/ 07 мая 2020

Немного сложно с вопросами CoreData, потому что их сложно скомпилировать локально. Тем не менее, попробуйте это: (Не компилируется, просто чтобы дать вам направление!)

struct PickerView: View {
  @State private var selection: Int? = nil     // Int? state 
  var body: some View {
    Picker(selection: $selection, label: EmptyView()) {
      ForEach(YourModel.indices) { index in    // Loop over your model's Int index  
        Text("\(YourModel.name)").tag(index).  // Tag the text with the index
      } 
    } 
  }
}

После того, как пользователь сделал выбор, вы должны найти свой объект по индексу: YourModel[$selection!]. Конечно, не забудьте защитить от nil или указать значение по умолчанию.

...