ich bräuchte bitte mal wieder Hilfe vom Fachmann / -frau.
Folgendes Problem:
Habe analog zur Doku eine TableView mit selection erstellt. Zuerst habe ich eine Hauptview, in der ich eine SubView aufrufe. (Brauche ich irgendwie wegen des Filters).
Alles anzeigen
In der UmsaetzeListView ist meine Tabelle
Alles anzeigen
Jetzt mein Problem: Programm wird gestartet und alles funktioniert auch soweit. Nur wenn ich in der obigen Tabelle eine Zeile auswähle, geht der Zähler unten um eines hoch, aber die Zeile ist nicht als ausgewählt sichtbar. Klicke ich dieselbe Zeile noch mal an, stürzt das Programm ab mit dem Hinweis, dass ein doppelter Eintrag im Set wäre.
Auch wenn ich den Filter weg lasse und die Tabelle direkt in die Hauptview baue, dasselbe Problem.
Bin gerade ziemlich ratlos, was die Ursache sein könnte und wäre für Hilfe dankbar.
Folgendes Problem:
Habe analog zur Doku eine TableView mit selection erstellt. Zuerst habe ich eine Hauptview, in der ich eine SubView aufrufe. (Brauche ich irgendwie wegen des Filters).
Quellcode
- struct UmsaetzeView: View {
- @Environment(\.dismiss) var dismiss
- @ObservedObject private var konto: Konten
- @State var selectedUmsaetze = Set<KontoUmsaetze.ID>()
- @State var selectedKlient: Klienten?
- @State private var rlFilter: Bool = false
- init(selectedKlient: Klienten, konto: Konten) {
- self.konto = konto
- _selectedKlient = State(initialValue: selectedKlient)
- }
- @State var filter: String = ""
- var body: some View {
- VStack(alignment: .leading) {
- [hier viel anderes Zeug, auch eine Suche mit $filter]
- UmsaetzeListView(
- konto: konto,
- klient: selectedKlient!,
- selectedUmsaetze: $selectedUmsaetze,
- filter: filter,
- rlZeitraum: rlFilter
- )
- }
- }
- }
In der UmsaetzeListView ist meine Tabelle
Quellcode
- struct UmsaetzeListView: View {
- @FetchRequest var transacts: FetchedResults<KontoUmsaetze>
- @ObservedObject private var konto: Konten
- @Binding var selectedUmsaetze: Set<KontoUmsaetze.ID>
- init(
- konto: Konten,
- klient: Klienten,
- selectedUmsaetze: Binding<Set<KontoUmsaetze.ID>>,
- filter: String,
- rlZeitraum: Bool = false
- ) {
- self.konto = konto
- _selectedUmsaetze = selectedUmsaetze
- var predicates = [NSPredicate]()
- if konto.iban != nil {
- predicates.append(NSPredicate(format: "iban = %@", (konto.iban)! as CVarArg))
- }
- var filterPred = [NSPredicate]()
- if filter != "" {
- filterPred.append(NSPredicate(format: "billingNo CONTAINS[cd] %@", filter))
- filterPred.append(NSPredicate(format: "recipient CONTAINS[cd] %@", filter))
- filterPred.append(NSPredicate(format: "verwendungszweck CONTAINS[cd] %@", filter))
- predicates.append(NSCompoundPredicate(type: .or, subpredicates: filterPred))
- }
- if rlZeitraum {
- let cal = Calendar.current
- var timePred = [NSPredicate]()
- let sdComp = cal.dateComponents([.year, .month, .day], from: (klient.rechnungslegungVon)!)
- let sd = cal.date(
- from: DateComponents(
- year: sdComp.year,
- month: sdComp.month,
- day: sdComp.day,
- hour: 0,
- minute: 0,
- second: 0
- )
- )
- let edComp = cal.dateComponents([.year, .month, .day], from: (klient.rechnungslegungBis)!)
- let ed = cal.date(
- from: DateComponents(
- year: edComp.year,
- month: edComp.month,
- day: edComp.day,
- hour: 23,
- minute: 59,
- second: 59
- )
- )
- timePred.append(NSPredicate(format: "valuta >= %@", sd! as CVarArg))
- timePred.append(NSPredicate(format: "valuta <= %@", ed! as CVarArg))
- predicates.append(NSCompoundPredicate(type: .and, subpredicates: timePred))
- }
- _transacts = FetchRequest<KontoUmsaetze>(
- sortDescriptors: [SortDescriptor(\KontoUmsaetze.valuta, order: .reverse), SortDescriptor(\KontoUmsaetze.counter, order: .forward)],
- predicate: NSCompoundPredicate(type: .and, subpredicates: predicates),
- animation: .default
- )
- }
- var body: some View {
- Table(transacts, selection: $selectedUmsaetze, sortOrder: $transacts.sortDescriptors) {
- TableColumn("date", value: \.valuta) { transact in
- Text(transact.valuta!, formatter: Formatters.dateFormatter)
- .bold()
- Spacer()
- }
- .width(70)
- TableColumn("Nr.", value: \.billingNo) { transact in
- Text(transact.billingNo ?? "")
- Spacer()
- }
- .width(75)
- TableColumn("Empf.", value: \.recipient) { transact in
- Text(transact.recipient ?? "")
- Spacer()
- }
- TableColumn("Verw.-Zw.", value: \.recipient) { transact in
- Text(transact.verwendungszweck ?? "")
- .lineLimit(4)
- .font(.caption)
- .help(transact.verwendungszweck ?? "")
- Spacer()
- }
- TableColumn("€", value: \.amount) { transact in
- Text(Formatters.currencyFormatter.string(from: transact.amount as NSNumber)!)
- .foregroundColor(transact.amount < 0.0 ? .red : .primary)
- .bold()
- Spacer()
- }
- .width(80)
- .alignment(.trailing)
- TableColumn("") { transact in
- Image(systemName: "circle.fill")
- .foregroundColor(
- .red
- )
- Spacer()
- }
- .width(20)
- }
- .font(.callout)
- Text("\(selectedUmsaetze.count)")
- }
- }
Auch wenn ich den Filter weg lasse und die Tabelle direkt in die Hauptview baue, dasselbe Problem.
Bin gerade ziemlich ratlos, was die Ursache sein könnte und wäre für Hilfe dankbar.