Binding richtig setzen in ForEach

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

  • Binding richtig setzen in ForEach

    Hallo Freunde und Freundinnen gepflegter Programmierung,

    irgendwie bekomme ich folgendes Problem nicht richtig gelöst

    Habe Array von Werten. Mit ForEach durch das Array und damit eine Armada von TextFields erstellen. Das TextField will ein Binding, also gebe ich ihm eins. So sieht dann mein Code aus.

    Quellcode

    1. ForEach(Array(aktenzeichen.enumerated()), id: \.element) { i, az in
    2. var x: String = az
    3. HStack(alignment: .firstTextBaseline) {
    4. Spacer()
    5. TextField("az",
    6. text: Binding<String>(
    7. get: {
    8. az.trimmingCharacters(in: .whitespacesAndNewlines)
    9. },
    10. set: {
    11. x = $0.trimmingCharacters(in: .whitespacesAndNewlines)
    12. }
    13. ),
    14. onEditingChanged: { editing in
    15. if !editing {
    16. aktenzeichen[i] = x
    17. }
    18. }
    19. )
    20. .labelsHidden()
    21. .frame(width: AppSettings.fieldWidth)
    22. .shadow(color: .gray, radius: 0.5, x: 0.0, y: 0.25)
    23. Button {
    24. aktenzeichen.remove(at: i)
    25. } label: {
    26. Label("del", systemImage: "minus.circle.fill")
    27. .foregroundStyle(Color.red)
    28. .labelStyle(.iconOnly)
    29. }
    30. .buttonStyle(.borderless)
    31. }
    32. }
    Alles anzeigen

    Mein Problem: entweder (Code etwas anders - s.u.) kann ich in den TextFields immer nur 1 Zeichen ändern und dann geht der Focus verloren oder (Code so wie oben) kann ich zwar was ändern, aber es wird nicht gespeichert.

    Code modifiziert (Nur das TextField - hier kann ich immer nur 1 Zeichen ändern):

    Quellcode

    1. TextField("az",
    2. text: Binding<String>(
    3. get: {
    4. az.trimmingCharacters(in: .whitespacesAndNewlines)
    5. },
    6. set: {
    7. aktenzeichen[i] = $0.trimmingCharacters(in: .whitespacesAndNewlines)
    8. }
    9. )
    10. )

    Wäre super, wenn mir jemand mit dem Binding helfen könnte.

    Schönes Wochenende und beste Grüße
  • Das Problem ist, dass deine Variable "az" nur sehr kurzzeitig am leben bleibt. Du musst diese ausserhalb der Schleife definieren.

    Ich selbst würde alles was sich in deiner Schleife befindet, in eine eigene View auslagern. Da kannst du dann das Binding oder eine Referenz (bspw Index) übergeben...
  • Das mit dem Subview erstmal ein super Tipp. Danke. Hab es jetzt so umgebaut.

    Einziger Wermutstropfen: ich muss ja irgendwie den Wert im Array wieder überschreiben, darum muss ich nach Änderung im TextField dessen Wert an der richtigen Stelle des Arrays überschreiben (Index halt)
    Das klappt bei mir jetzt nur, wenn ich die Enter-Taste drücke, bevor ich den Speichern-Button klicke.

    Mein Subview schaut jetzt so aus:

    Quellcode

    1. struct KontaktAzEditView: View {
    2. @State var az: String
    3. @Binding var aktenzeichen: [String]
    4. @State var i: Int
    5. init(
    6. az: String,
    7. aktenzeichen: Binding<[String]>,
    8. i: Int
    9. ) {
    10. _az = State(initialValue: az)
    11. _aktenzeichen = aktenzeichen
    12. _i = State(initialValue: i)
    13. }
    14. var body: some View {
    15. TextField("az", text: $az, onEditingChanged: { _ in
    16. aktenzeichen[i] = az
    17. })
    18. .labelsHidden()
    19. .frame(width: AppSettings.fieldWidth)
    20. .shadow(color: .gray, radius: 0.5, x: 0.0, y: 0.25)
    21. }
    22. }
    Alles anzeigen
    Wenn ich einen .onChange benutze, dann verliert das TextField wieder den Focus. Mal noch ein wenig basteln. Aber vielleicht hat noch jemand eine Idee.
  • Sorry, weshalb übergibst du nicht direkt den Wert direkt als Binding?

    den gesamten Init, kannst Du dir im übrigen sparen. Einfach die Variable richtig deklariern, feritg..

    Im TextField, sagst du nur noch dass es sich um ein Binding handelt, fertitg.. kurzes Beispiel, findest du hier: hackingwithswift.com/forums/swiftui/dynamic-textfield/6020 oder hier: swiftbysundell.com/articles/building-editable-swiftui-lists/