No se puede seleccionar la misma fila dos veces en SwiftUI

19

Tengo una lista de navegación con múltiples secciones y filas. Selecciono una fila para navegar a la vista que quiero. Sin embargo, cuando vuelvo a la vista raíz, no puedo seleccionar la fila foo. Toco fila foo y no pasa nada.

Toco la barra de fila y esa fila me envía a su vista. Volver a la vista raíz. Entonces no puedo seleccionar la barra de fila, pero ahora la fila funciona.

¿Es esto un error en SwiftUI o un comportamiento diseñado? ¿Hay algo que deba hacer para restablecer las vistas cuando las deje?

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

Aquí hay otro caso con el mismo problema. Solo puedo seleccionar la fila del selector del formulario una vez. Si vuelvo a la vista raíz y luego vuelvo a esta vista, puedo seleccionar el selector nuevamente.

Si configuro pickerStyle en SegmentedPickerStyle (), puedo seleccionarlo varias veces.

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

Ejecutando XCode Versión 11.2.1 (11B500) e iOS 13.3 beta.

Agregar ShoppingItemRow para más información

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
fuente
¿Puede proporcionar algunos datos de muestra para mirar?
fulvio
1
Se agregó otro ejemplo.
adamek
Más interesante es lo que hay dentroShoppingItemRow
Asperi
1
Es un error con el NavigationLink y es muy fácil de reproducir en pequeñas muestras. Vea mi publicación: forums.developer.apple.com/message/395130 . Informe esto en Feedback Assistant para que Apple lo note.
Thomas Vos
1
Lo he informado en Feedback Assistant.
adamek

Respuestas:

13

Apple corrigió el error en iOS 13.3 beta 4. Tenga en cuenta que iOS 13.3 estaba en beta en el momento en que lo probó. No era un error en iOS 13.2, por lo que ya no hay nada de qué preocuparse.

Actualización para la versión iOS 13.3:

El error se corrigió en dispositivos físicos pero aún está presente en el emulador.

Thomas Vos
fuente
Beta descargada 4. Sí, lo arregló.
adamek
44
13.3 está fuera de beta, pero acabo de encontrar el problema. Se produce en todos los simuladores que ejecutan 13.3 (teléfonos y almohadillas). Todavía no lo he probado en un dispositivo físico.
ejecutor21
3

Tengo el mismo problema, mira esta publicación . El problema solo ocurre en un iPad físico de 9.7 pulgadas. No con en el simulador, ni en mi iPhone.

simibac
fuente
Xcode: 11.3; iOS 13.3.1 Para mí, no funciona a través del simulador, pero funciona con el dispositivo.
Frederick C. Lee