SwiftUI'de aynı satır iki kez seçilemiyor


19

Birden fazla bölüm ve satır içeren bir gezinme listem var. Bir sıra foo seçiyorum, istediğim görünüme gidiyor. Ancak, kök görünümüne geri döndüğümde, satır foo'yu seçemiyorum. Ben foo satır dokunun ve hiçbir şey olmuyor.

Satır çubuğuna dokunuyorum ve o satır beni görünümüne gönderiyor. Kök görünümüne geri dönün. Sonra satır çubuğunu seçemiyorum, ama şimdi row foo çalışıyor.

Bu SwiftUI veya tasarlanmış davranışta bir hata mı? Görünümlerden çıkarken sıfırlamak için yapmam gereken bir şey var mı?

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

İşte aynı sorunu olan başka bir durum. Formun seçici satırını yalnızca bir kez seçebilirim. Kök görünüme dönüp tekrar bu görünüme dönersem, seçiciyi tekrar seçebilirim.

PickerStyle öğesini SegmentedPickerStyle () olarak ayarlarsam, bunu birden çok kez seçebilirim.

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

XCode Sürüm 11.2.1 (11B500) ve iOS 13.3 beta sürümünü çalıştırma.

Daha fazla bilgi için ShoppingItemRow ekleme

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

}

Bakmak için bazı örnek veriler sağlayabilir misiniz?
fulvio

1
Başka bir örnek eklendi.
adamek

İçinde ne var daha ilginçShoppingItemRow
Asperi

1
NavigationLink ile ilgili bir hatadır ve küçük örneklerde çoğaltılması çok kolaydır. Yazıma bakın: forums.developer.apple.com/message/395130 . Apple'ın bildirmesi için lütfen bunu Feedback Assistant'ta bildirin.
Thomas Vos

1
Geri bildirim asistanında bildirdim.
adamek

Yanıtlar:


13

Hata, Apple tarafından iOS 13.3 beta 4'te düzeltildi. İOS 13.3'ün test ettiğiniz sırada beta sürümünde olduğunu unutmayın. İOS 13.2'de bir hata değildi, bu yüzden artık endişelenecek bir şey yok.

İOS 13.3 sürümü için güncelleme:

Hata fiziksel cihazlarda düzeltildi ancak emülatörde hala mevcut.


Beta 4. indirildi. Evet düzeltti.
1919'da adamek

4
13.3 beta dışında ancak sorunla yeni karşılaştım. 13.3 (Telefonlar ve Pedler) çalıştıran tüm simülatörlerde oluşur. Henüz fiziksel bir cihazda test etmedim.
executor21

3

Aynı problemim var, bu gönderiye bakın . Sorun yalnızca fiziksel bir iPad 9.7 inç'te ortaya çıkıyor. Simülatörde değil, iPhone'umda da değil.


Xcode: 11.3; iOS 13.3.1 Benim için simülatörle çalışmıyor, ancak cihazla çalışıyor.
Frederick
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.