Probleme mit Picker in Swift UI

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Probleme mit Picker in Swift UI

    Hallo zusammen! In meiner Anwendung habe ich in CoreData Daten von Kunden, nun möchte ich einen Picker mit deren Namen erschaffen. Das Problem dabei ist, dass unabhängig davon welchen Namen ich auswähle, es ist als ob ich gar nichts ausgewählt hätte - es bleibt im SImulator immer nur der erste Name ausgewählt. Der Picker den ich zunächst als einfaches Beispiel ausprobiert habe, funktioniert:

    Quellcode

    1. struct Formularelemente: View {
    2. @State private var selectedOption = 0
    3. let options = ["Option 1", "Option 2", "Option 3"]
    4. var body: some View {
    5. VStack {
    6. Text("Selected Option: \(options[selectedOption])")
    7. Picker("Options", selection: $selectedOption) {
    8. ForEach(0..<options.count) { index in
    9. Text(options[index]).tag(index)
    10. }
    11. }
    12. .pickerStyle(MenuPickerStyle())
    13. }
    14. .padding()
    15. }
    16. }
    Alles anzeigen


    Mit CoreData scheint es aber nicht zu funktionieren, obwohl die Daten im Objekt Kunden vorhanden sind - wenn ich sie mit Text() innerhalb einer Schleife ausgebe - direkt unter dem Picker - ist alles da. Auch im Picker sind alle Namen da, nur kann ich nichts auswählen. Hier ist mein Code in zwei Varianten, die ich versucht habe. Variante 1:


    Quellcode

    1. struct Formularelemente: View {
    2. // Verbindung zur Umgebung, in der eine DB-Verbindung verankert ist:
    3. @Environment(\.managedObjectContext) private var viewContext
    4. // In der Abfrage kann in die eckigen Klammern ein Sortierkriterium wie nach Datum, ASC, DESC etc. rein
    5. @FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \DBKunden.personencode, ascending: true)])
    6. var kunden: FetchedResults<DBKunden>
    7. @StateObject var mitarbeiter: Mitarbeiter
    8. @StateObject var infobogen = Infobogen()
    9. @State private var selectedKundeID: Int64? = 0
    10. var body: some View {
    11. ScrollView {
    12. VStack {
    13. // 1. Begrüssungszeile
    14. BackButton(mitarbeiter: mitarbeiter)
    15. Picker("Kunde", selection: $selectedKundeID) {
    16. ForEach(0..<kunden.count) { index in
    17. let kunde = kunden[index]
    18. Text(kunde.personencode!)
    19. .tag(index)
    20. }
    21. }
    22. .pickerStyle(MenuPickerStyle())
    23. if let selectedID = selectedKundeID {
    24. Text("Selected Kunde ID: \(selectedID)")
    25. }
    26. ForEach(kunden) {kunde in
    27. Text("ID vom \(kunde.personencode!) ist \(kunde.id)")
    28. }
    29. }
    30. }
    31. }
    32. }
    Alles anzeigen
    Sowie Variante 2:



    Quellcode

    1. import SwiftUI
    2. import CoreData
    3. struct Formularelemente: View {
    4. // Verbindung zur Umgebung, in der eine DB-Verbindung verankert ist:
    5. @Environment(\.managedObjectContext) private var viewContext
    6. // In der Abfrage kann in die eckigen Klammern ein Sortierkriterium wie nach Datum, ASC, DESC etc. rein
    7. @FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \DBKunden.personencode, ascending: true)])
    8. var kunden: FetchedResults<DBKunden>
    9. @StateObject var mitarbeiter: Mitarbeiter
    10. @StateObject var infobogen = Infobogen()
    11. @State private var selectedKundeID: Int64? = 0
    12. var body: some View {
    13. ScrollView {
    14. VStack {
    15. // 1. Begrüssungszeile
    16. BackButton(mitarbeiter: mitarbeiter)
    17. Picker("Kunde", selection: $selectedKundeID) {
    18. ForEach(kunden) { kunde in
    19. Text(kunde.personencode!)
    20. .tag(kunde.id)
    21. }
    22. }
    23. .pickerStyle(MenuPickerStyle())
    24. if let selectedID = selectedKundeID {
    25. Text("Selected Kunde ID: \(selectedID)")
    26. }
    27. ForEach(kunden) {kunde in
    28. Text("ID vom \(kunde.personencode!) ist \(kunde.id)")
    29. }
    30. }
    31. }
    32. }
    33. }
    Alles anzeigen

    Bin sehr gespannt auf eure Ideen und danke im Voraus für jede Hilfe!
  • Noch ein Detail, ich habe gerade gesehen dass es dazu folgende Fehlermeldung gibt:

    Picker: the selection "0" is invalid and does not have an associated tag, this will give undefined results.

    Nun ja, aber wenn ich den Weg über den Index gehe, dann müssten alle Kunden doch in einem Array sein, da muss doch das erste Element den Index 0 haben, wo ist mein Denkfehler?

    Wenn ich wiederum .tag(kunde.id) schreibe und oben eine ID eingebe wie

    Quellcode

    1. @State private var selectedKundeID: Int64? = 2
    Und es gibt definitiv einen Kunden mit der ID 2, dürfte nach meinem Verständnis dieser Fehler nicht auftreten. Also übersehe ich etwas, aber was?
  • Ja, daran habe ich gedacht, dabnei aber einen Fehler gemacht, danke! m Datenmodell ist für die Entität Kunde die EIgenschaft "id" als Integer 64 definiert. SlectKundeID sollte ebenfalls Int64 sein, allerdings hatte ich sie als Int64? definiert (Optional) mit dem Hintergedanken, dass bis zur ersten Auswahl noch kein Wert vorhanden ist. Nun ist aber Int64? nicht Int64 - da hast du natürlich vollkommen Recht.

    Ich müsste also dem Picker einen Wert vorgeben, da Int64 ja nicht mit nil umgehen kann - z.B. "0". Vielen vielen Dank!