Impossible de sélectionner deux fois la même ligne dans SwiftUI

19

J'ai une liste de navigation avec plusieurs sections et lignes. Je sélectionne une ligne foo, elle accède à la vue que je souhaite. Cependant, lorsque je reviens à la vue racine, je ne peux pas sélectionner la ligne foo. J'appuie sur foo et rien ne se passe.

Je tape sur la barre de ligne et cette ligne m'envoie à sa vue. Retour à la vue racine. Ensuite, je ne peux pas sélectionner la barre de ligne, mais maintenant, la fonction foo de ligne fonctionne.

Est-ce un bug dans SwiftUI ou un comportement conçu? Dois-je faire quelque chose pour réinitialiser les vues lorsque je les quitte?

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])
            }
        }
}
}

Voici un autre cas avec le même problème. Je ne peux sélectionner la ligne de sélection du formulaire qu'une seule fois. Si je reviens à la vue racine, puis de nouveau à cette vue, je peux à nouveau sélectionner le sélecteur.

Si je règle le pickerStyle sur SegmentedPickerStyle (), je peux le sélectionner plusieurs fois.

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))
    }
}

Exécution de XCode version 11.2.1 (11B500) et iOS 13.3 bêta.

Ajout de ShoppingItemRow pour plus d'informations

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
la source
Pouvez-vous fournir des exemples de données à consulter?
fulvio
1
Ajout d'un autre exemple.
adamek
Le plus intéressant est ce qu'il y a à l'intérieurShoppingItemRow
Asperi
1
Il s'agit d'un bug avec NavigationLink et il est très facile à reproduire en petit échantillon. Voir mon article: forums.developer.apple.com/message/395130 . Veuillez le signaler dans Feedback Assistant pour qu'Apple le remarque.
Thomas Vos
1
Je l'ai signalé dans Feedback Assistant.
adamek

Réponses:

13

Le bug est corrigé par Apple dans iOS 13.3 beta 4. Gardez à l'esprit que iOS 13.3 était en beta au moment où vous l'avez testé. Ce n'était pas un bug dans iOS 13.2, donc ce n'est plus rien à craindre.

Mise à jour pour la version iOS 13.3:

Le bug est corrigé sur les appareils physiques mais est toujours présent sur l'émulateur.

Thomas Vos
la source
Téléchargé bêta 4. Oui, il l'a corrigé.
adamek
4
13.3 n'est plus en version bêta, mais je viens de rencontrer le problème. Se produit sur tous les simulateurs exécutant la version 13.3 (téléphones et pads). Je ne l'ai pas encore testé sur un appareil physique.
executor21
3

J'ai le même problème, voir ce post . Le problème se produit uniquement sur un iPad physique de 9,7 pouces. Pas avec dans le simulateur, ni sur mon iPhone.

simibac
la source
Xcode: 11,3; iOS 13.3.1 Pour moi, ne fonctionne pas via le simulateur mais fonctionne avec l'appareil.
Frederick C. Lee