NavigationSplitView und SwiftData mit TextFields

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

  • NavigationSplitView und SwiftData mit TextFields

    Hallo zusammen,


    Zeit für meinen ersten Eintrag hier im Forum.
    Ich muss zugeben ich bin neu in der iOS Entwicklung und stehe aktuell vor einem Problem.


    Ich habe per SwiftData ein Model erstellt. Erst mal zum Test nichts dolles:


    Quellcode

    1. @Model
    2. class Immobilie {
    3. var id: String
    4. var name : String
    5. var strasseHausNr: String
    6. init(name: String, strasseHausNr: String) {
    7. self.id = UUID().uuidString
    8. self.name = name
    9. self.strasseHausNr = strasseHausNr
    10. }
    11. }
    Alles anzeigen

    Dann habe ich eine NavigationSplitView erzeugt in der in der 1. Spalte eine List mit Einträgen aus der Modelklasse erstellt wird. Soweit so gut. Damit die Detail Ansicht (2. Spalte) korrekt angezeigt wird, muss man die Liste per "Selection" Anweisung erstellen.
    Sobald man einen Eintrag ausgewählt hat befindet sich in der Selektion Variable ein Optional von dem ausgewählten Objekt. Und hier ist das Problem. Ich möchte in der Detail Ansicht Textfelder verwenden und hier ein Optional als Binding Parameter anzugeben geht nicht. Auch mit forced Unwrapped nicht.


    Ich habe das jetzt erstmal so gelöst, dass ich den der DetailView eine @State Variable vom Optional erstelle. Das ganz funktioniert und die Views werden aktualisiert sowie SwiftData speichert die Daten auch, aber es fühlt sich irgendwie nicht richtig an. Und bei er Ausführung meckert Xcode auch per Warnung:


    Accessing State's value outside of being installed on a View. This will result in a constant Binding of the initial value and will not update.


    Ich denke man kann das irgendwie eleganter machen.
    Hier mein auf das Wesentliche gekürzter Code:


    Quellcode

    1. import SwiftUI
    2. import SwiftData
    3. struct View_Immos: View {
    4. @Environment(\.modelContext) private var context
    5. @Query private var immos: [Immobilie]
    6. @State private var columnVisibility = NavigationSplitViewVisibility.doubleColumn
    7. @State private var suchfeld = ""
    8. @State private var aktImmo : Immobilie?
    9. var body: some View {
    10. NavigationSplitView(columnVisibility: $columnVisibility) {
    11. VStack{
    12. Text("Immobilien")
    13. .padding(.bottom, 30)
    14. HStack {
    15. Spacer()
    16. Text("Suche:")
    17. .padding(.leading)
    18. TextField("Suchkriterien", text: $suchfeld)
    19. .padding(.trailing)
    20. .textFieldStyle(RoundedBorderTextFieldStyle())
    21. .disableAutocorrection(true)
    22. Spacer()
    23. }
    24. List(immos, selection: $aktImmo) {immo in
    25. NavigationLink(immo.name, value: immo)
    26. }
    27. .font(.title3)
    28. .padding(.top, 0)
    29. }
    30. } detail: {
    31. // Ich denke das nächste ist nicht ganz OK
    32. @State var te: Immobilie = aktImmo ?? Immobilie(name: "", strasseHausNr: "")
    33. VStack {
    34. HStack {
    35. Text("Name der Immobilie:")
    36. TextField(text: $te.name) {
    37. Text(name)
    38. }.textFieldStyle(.roundedBorder)
    39. }
    40. }
    41. }
    Alles anzeigen

    Das Problem ist halt, dass folgendes nicht geht, weil aktImmo ein Optional ist.


    Quellcode

    1. TextField(text: $aktImmu.name) {
    2. Text(name)
    3. }.textFieldStyle(.roundedBorder)


    Für Hinweise ich die richtige Richtung wäre ich sehr dankbar.

    Viele Grüße Micky