App: der Tag-Schritt beim Anlegen erschien nie - jetzt geschoben statt aufgelegt
Nach dem Anlegen eines einzelnen Stuecks sollte das Tag-Blatt aufgehen. Es kam nie. Ein zweites Blatt aus einem Blatt heraus ist hier gleich dreifach riskant: ItemAddSheet traegt schon ein fullScreenCover (Lagerort scannen) - zwei Praesentations-Modifikatoren am selben View vertragen sich in SwiftUI nicht zuverlaessig - und das Formular wird selbst aus einer Section heraus gezeigt. Vor beidem warnen ProductDetailView:349 und ItemViews:775 bereits aus eigener Erfahrung. Der Tag-Schritt wird deshalb in den ohnehin vorhandenen NavigationStack geschoben. Ein Schub kennt keine dieser Fallen und ist fuer einen Schritt in einem Ablauf ohnehin die passendere Form. NFCSchreibenView bekommt dafuer ein optionales onFertig. Ohne Angabe schliesst sie sich selbst wie bisher - der Aufruf aus der Stueck-Bearbeitung bleibt unveraendert. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
d7002e2252
commit
38489a5217
@@ -868,7 +868,9 @@ struct ItemAddSheet: View {
|
|||||||
@State private var locScanShown = false
|
@State private var locScanShown = false
|
||||||
/// Frisch angelegtes Stueck, dessen Tag gleich beschrieben werden soll.
|
/// Frisch angelegtes Stueck, dessen Tag gleich beschrieben werden soll.
|
||||||
@State private var nfcItem: Item?
|
@State private var nfcItem: Item?
|
||||||
/// Ob nach dem Tag-Blatt bis zur Liste geschlossen wird („Anlegen & fertig").
|
/// Loest den Schub zum Tag-Schritt aus (navigationDestination, iOS 16).
|
||||||
|
@State private var nfcPush = false
|
||||||
|
/// Ob nach dem Tag-Schritt bis zur Liste geschlossen wird („Anlegen & fertig").
|
||||||
@State private var nfcFinish = false
|
@State private var nfcFinish = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
@@ -966,13 +968,18 @@ struct ItemAddSheet: View {
|
|||||||
locations = (try? await APIClient.shared.locations()) ?? []
|
locations = (try? await APIClient.shared.locations()) ?? []
|
||||||
shops = (try? await APIClient.shared.shops()) ?? []
|
shops = (try? await APIClient.shared.shops()) ?? []
|
||||||
}
|
}
|
||||||
// Blatt auf Blatt: Das Anlege-Blatt bleibt stehen, bis der Tag
|
// GESCHOBEN und nicht als zweites Blatt aufgelegt. Ein Blatt aus einem
|
||||||
// geschrieben (oder uebersprungen) ist. Erst sein Verschwinden schliesst
|
// Blatt heraus ist hier gleich dreifach riskant: Dieses Formular traegt
|
||||||
// beide - das ist die Reihenfolge, die SwiftUI vertraegt.
|
// schon ein fullScreenCover (Lagerort scannen), und es wird selbst aus
|
||||||
.sheet(item: $nfcItem, onDismiss: {
|
// einer Section heraus gezeigt - wovor ProductDetailView:349 und
|
||||||
if nfcFinish, let onFinish { onFinish() } else { dismiss() }
|
// ItemViews:775 jeweils aus eigener Erfahrung warnen. Ein Schub in den
|
||||||
}) { stueck in
|
// ohnehin vorhandenen NavigationStack umgeht alle drei Fallen.
|
||||||
NavigationStack { NFCSchreibenView(item: stueck) }
|
.navigationDestination(isPresented: $nfcPush) {
|
||||||
|
if let stueck = nfcItem {
|
||||||
|
NFCSchreibenView(item: stueck, onFertig: {
|
||||||
|
if nfcFinish, let onFinish { onFinish() } else { dismiss() }
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1035,7 +1042,8 @@ struct ItemAddSheet: View {
|
|||||||
if created.count == 1, NFCDienst.verfuegbar {
|
if created.count == 1, NFCDienst.verfuegbar {
|
||||||
nfcFinish = finish
|
nfcFinish = finish
|
||||||
nfcItem = created[0]
|
nfcItem = created[0]
|
||||||
return // Schliessen uebernimmt das onDismiss des Tag-Blatts
|
nfcPush = true
|
||||||
|
return // Schliessen uebernimmt „Fertig" im Tag-Schritt
|
||||||
}
|
}
|
||||||
if finish, let onFinish { onFinish() } else { dismiss() }
|
if finish, let onFinish { onFinish() } else { dismiss() }
|
||||||
} catch { self.error = error.localizedDescription }
|
} catch { self.error = error.localizedDescription }
|
||||||
|
|||||||
@@ -7,6 +7,11 @@ import SwiftUI
|
|||||||
/// steht – `vorrania://i/<UID>`.
|
/// steht – `vorrania://i/<UID>`.
|
||||||
struct NFCSchreibenView: View {
|
struct NFCSchreibenView: View {
|
||||||
let item: Item
|
let item: Item
|
||||||
|
/// Was „Fertig" tun soll. Ohne Angabe schliesst die Ansicht sich selbst –
|
||||||
|
/// das ist der Fall, wenn sie aus der Stueck-Bearbeitung heraus aufgerufen
|
||||||
|
/// wird. Haengt sie als Schritt an einem Ablauf (gleich nach dem Anlegen),
|
||||||
|
/// muss stattdessen der ganze Ablauf enden.
|
||||||
|
var onFertig: (() -> Void)? = nil
|
||||||
|
|
||||||
@Environment(\.dismiss) private var dismiss
|
@Environment(\.dismiss) private var dismiss
|
||||||
|
|
||||||
@@ -62,7 +67,11 @@ struct NFCSchreibenView: View {
|
|||||||
}
|
}
|
||||||
.navigationTitle("NFC-Tag")
|
.navigationTitle("NFC-Tag")
|
||||||
.navigationBarTitleDisplayMode(.inline)
|
.navigationBarTitleDisplayMode(.inline)
|
||||||
.toolbar { ToolbarItem(placement: .topBarLeading) { Button("Fertig") { dismiss() } } }
|
.toolbar {
|
||||||
|
ToolbarItem(placement: .topBarLeading) {
|
||||||
|
Button("Fertig") { if let onFertig { onFertig() } else { dismiss() } }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func schreiben() async {
|
private func schreiben() async {
|
||||||
|
|||||||
Reference in New Issue
Block a user