In SwiftUI kann dieselbe Zeile nicht zweimal ausgewählt werden

19

Ich habe eine Navigationsliste mit mehreren Abschnitten und Zeilen. Ich wähle eine Zeile foo aus, sie navigiert zu der gewünschten Ansicht. Wenn ich jedoch zur Stammansicht zurückkehre, kann ich Zeile foo nicht auswählen. Ich tippe auf Zeile foo und nichts passiert.

Ich tippe auf die Zeilenleiste und diese Zeile sendet mich zu ihrer Ansicht. Zurück zur Stammansicht. Dann kann ich keine Zeilenleiste auswählen, aber jetzt funktioniert Zeile foo.

Ist dies ein Fehler in SwiftUI oder ein entworfenes Verhalten? Muss ich etwas tun, um Ansichten zurückzusetzen, wenn ich sie verlasse?

NavigationView {
            List {
Section(header: shoppingListData.lastItemSection.sectionHeader, footer: shoppingListData.lastItemSection.sectionFooter) {
            ForEach(0..<shoppingListData.lastItemSection.sectionRows.count) { index in
                ShoppingItemRow(shoppingListData: self.shoppingListData,
                                rowItem: self.shoppingListData.lastItemSection.sectionRows[index])
            }
        }
}
}

Hier ist ein weiterer Fall mit dem gleichen Problem. Ich kann die Auswahlzeile des Formulars nur einmal auswählen. Wenn ich zur Stammansicht und dann wieder zu dieser Ansicht zurückkehre, kann ich die Auswahl erneut auswählen.

Wenn ich den pickerStyle auf SegmentedPickerStyle () setze, kann ich ihn mehrmals auswählen.

struct ShoppingItemPage: View {
    @ObservedObject var shoppingListData: ShoppingListData
    @ObservedObject var shoppingItem: ShoppingItems
    var body: some View {
        Form {
            Section(header: Text("Packages")) {
                HStack {
                    Text("Quantity (\(shoppingItem.myUnit.myName))")

                    TextField("Quantity (\(shoppingItem.myUnit.myName))", value: $shoppingItem.stdQty, formatter: basicFormat)
                        .textFieldStyle(RoundedBorderTextFieldStyle())
                        .keyboardType(.numbersAndPunctuation)

                    Toggle("Need", isOn: $shoppingItem.needed)
                }
                HStack {
                    Text("Item Name")
                    TextField("Item Name", text: $shoppingItem.myName, onEditingChanged: { (a) in
                        self.shoppingItem.modified()
                    }) {
                        self.shoppingItem.modified()
                    }.textFieldStyle(RoundedBorderTextFieldStyle())
                }


                Picker(selection: $shoppingItem.urgency, label: Text("Urgency")) {
                    ForEach(Ledgers.ReceiptUrgency.list(), id: \.rawValue) { urgency in
                        Text(urgency.description()).tag(urgency)
                    }
                }                
            }
        }.navigationBarTitle(Text(shoppingItem.myName))
    }
}

Ausführen von XCode Version 11.2.1 (11B500) und iOS 13.3 Beta.

Hinzufügen von ShoppingItemRow für weitere Informationen

struct ShoppingItemRow: View {

    @ObservedObject var shoppingListData: ShoppingListData
    @ObservedObject var rowItem: ShoppingItems

    var id: UUID {
        return rowItem.uuidKey
    }

    var body: some View {
        NavigationLink(destination: ShoppingItemPage(shoppingListData: shoppingListData, shoppingItem: rowItem)) {
            HStack(alignment: .center) {
                VStack(alignment: .leading)  {
                    rowName
                    rowDescription
                    rowPremiumDescription
                }
                Spacer()
                VStack(alignment: .trailing) {
                    rowPrice
                    rowPremium
                }
            }.padding(3)
            }.background(premiumColor)
    }

    var rowName: Text {
        if let msp = rowItem.minStorePackage {
            return Text(msp.brandName).font(.body).fontWeight(.bold)
        }
        // fall through
        return Text(rowItem.myName).font(.body).fontWeight(.bold)
    }

    var rowPrice: Text {
        if let msp = rowItem.minStorePackage {
            let dq = msp.defQty
            let pr = msp.pkgCost(pkgQty: dq)
            return Text(pr.cash()).font(.body)
        } else if let mp = rowItem.minPackage {
            let dq = mp.defQty
            let pr = mp.pkgCost(pkgQty: dq)
            return Text(pr.cash()).font(.body)
        } else {
            return Text("rowPrice Test")
            // return Text("0").hidden() as! Text
        }
    }

    var rowPremium: Text? {
        if let msp = rowItem.minStorePackage {
            let dq = msp.defQty
            let pc = msp.premiumCents(pkgQty: dq)
            if pc == 0 {
                return Text("0").hidden() as? Text
            } else {
                return Text(pc.cash()).font(.caption)
            }
        } else {
            return Text("0").hidden() as? Text
        }
    }

    var rowDescription: Text? {
        if let msp = rowItem.minStorePackage {
            let dq = msp.defQty
            let unitText: String
            if msp.pkgInteger {
                if dq == 1 {
                    unitText = "\(msp.pkgSize.basicString()) \(rowItem.myUnit.myName)"
                } else {
                    unitText = "\(dq.basicString()) x [\(msp.pkgSize.basicString()) \(rowItem.myUnit.myName)]"
                }
            } else {
                unitText = "\((dq * msp.pkgSize).basicString()) \(rowItem.myUnit.myName)"
            }
            let thisText = "\(unitText) \(msp.costX()) (\(msp.stdPrice.cash())/\(rowItem.myUnit.myName))"
            return Text(thisText).font(.caption)
        } else {
            return Text("").hidden() as? Text
        }
    }

    var rowPremiumDescription: Text? {
        if let msp = rowItem.minStorePackage {
            let dq = msp.defQty
            let premium = msp.premiumCents(pkgQty: dq)
            if premium == 0 {
                return Text("Minimum price at \(shoppingListData.dataStack.currentReceipt.myStore!.longName).").font(.caption)
            } else {
                let mp = rowItem.minPackage!
                return Text("\(premium.cash()) cheaper at \(mp.myStore.longName)").font(.caption)
            }
        } else if let mp = rowItem.minPackage {
            let dq = mp.defQty
            let pc = "Minimum price \(mp.pkgCost(pkgQty: dq).cash()) (\(mp.stdPrice.cash()) \(rowItem.myUnit.myName)) at "
            let storeName = mp.myStore.longName
            return Text("\(pc)\(storeName)").font(.caption)
        } else {
            return Text("").hidden() as? Text
        }
    }

    var premiumColor: Color {
        if let msp = rowItem.minStorePackage {
            let dq = msp.defQty
            let pc = msp.premiumCents(pkgQty: dq)
            if pc == 0 {
                return Color.yellow
            } else {
                return Color.clear
            }
        } else {
            return Color.clear
        }
    }

}
adamek
quelle
Können Sie einige Beispieldaten zum Anschauen bereitstellen?
Fulvio
1
Ein weiteres Beispiel wurde hinzugefügt.
Adamek
Interessanter ist, was drin istShoppingItemRow
Asperi
1
Es ist ein Fehler mit dem NavigationLink und lässt sich sehr einfach in kleinen Beispielen reproduzieren. Siehe meinen Beitrag: forums.developer.apple.com/message/395130 . Bitte melden Sie dies im Feedback-Assistenten, damit Apple dies bemerkt.
Thomas Vos
1
Ich habe es im Feedback-Assistenten gemeldet.
Adamek

Antworten:

13

Der Fehler wurde von Apple in iOS 13.3 Beta 4 behoben. Beachten Sie, dass iOS 13.3 zum Zeitpunkt des Tests in der Beta war. Es war kein Fehler in iOS 13.2, daher besteht kein Grund mehr zur Sorge.

Update für iOS 13.3:

Der Fehler wurde auf physischen Geräten behoben, ist aber im Emulator weiterhin vorhanden.

Thomas Vos
quelle
Heruntergeladene Beta 4. Ja, es wurde behoben.
Adamek
4
13.3 ist aus der Beta, aber ich bin gerade auf das Problem gestoßen. Tritt auf allen Simulatoren mit 13.3 (Telefone und Pads) auf. Ich habe es noch nicht auf einem physischen Gerät getestet.
Testamentsvollstrecker21
3

Ich habe das gleiche Problem, siehe diesen Beitrag . Das Problem tritt nur auf einem physischen iPad 9,7 Zoll auf. Weder im Simulator noch auf meinem iPhone.

simibac
quelle
Xcode: 11,3; iOS 13.3.1 Funktioniert für mich nicht über den Simulator, sondern mit dem Gerät.
Frederick C. Lee