Non è possibile selezionare due volte la stessa riga in SwiftUI


19

Ho un elenco di navigazione con più sezioni e righe. Seleziono una riga foo, passa alla vista che desidero. Tuttavia, quando torno alla vista principale, non riesco a selezionare la riga pippo. Tocco fila foo e non succede nulla.

Tocco la barra della riga e quella riga mi invia alla sua vista. Torna alla vista principale. Quindi non riesco a selezionare la barra della riga, ma ora la riga foo funziona.

È un bug in SwiftUI o un comportamento progettato? C'è qualcosa che devo fare per ripristinare le visualizzazioni quando le lascio?

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

Ecco un altro caso con lo stesso problema. Posso selezionare solo una volta la riga di selezione del modulo. Se torno alla vista principale e poi di nuovo a questa vista, posso selezionare nuovamente il selettore.

Se imposto pickerStyle su SegmentedPickerStyle (), posso selezionarlo più volte.

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

Esecuzione di XCode versione 11.2.1 (11B500) e iOS 13.3 beta.

Aggiunta di ShoppingItemRow per ulteriori informazioni

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

}

Potete fornire alcuni dati di esempio da guardare?
Fulvio,

1
Aggiunto un altro esempio.
Adamek,

Più interessante è ciò che c'è dentroShoppingItemRow
Asperi il

1
È un bug con NavigationLink ed è molto facile da riprodurre in piccoli campioni. Vedi il mio post: forum.developer.apple.com/message/395130 . Segnalalo in Feedback Assistant in modo che Apple lo noti.
Thomas Vos,

1
L'ho segnalato in Feedback Assistant.
adamek,

Risposte:


13

Il bug è stato corretto da Apple in iOS 13.3 beta 4. Tieni presente che iOS 13.3 era in beta al momento del test. Non era un bug in iOS 13.2, quindi non c'è più nulla di cui preoccuparsi.

Aggiornamento per iOS 13.3:

Il bug è stato risolto su dispositivi fisici ma è ancora presente sull'emulatore.


Beta scaricato 4. Sì, è stato risolto.
Adamek,

4
13.3 è fuori beta, ma ho appena riscontrato il problema. Si verifica su tutti i simulatori che eseguono 13.3 (telefoni e pad). Non l'ho ancora testato su un dispositivo fisico.
esecutore21

3

Ho lo stesso problema, vedi questo post . Il problema si verifica solo su un iPad fisico da 9,7 pollici. Non con nel simulatore, né sul mio iPhone.


Xcode: 11.3; iOS 13.3.1 Per me, non funziona tramite simulatore ma funziona con il dispositivo.
Frederick C. Lee
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.