Tidak dapat memilih baris yang sama dua kali dalam SwiftUI

19

Saya memiliki daftar navigasi dengan banyak bagian dan baris. Saya memilih foo baris, itu menavigasi ke tampilan yang saya inginkan. Namun, ketika saya kembali ke tampilan root, saya tidak dapat memilih foo baris. Saya mengetuk baris foo dan tidak ada yang terjadi.

Saya ketuk baris bar dan baris itu mengirim saya ke tampilan. Kembali ke tampilan root. Maka saya tidak bisa memilih baris bar, tapi sekarang baris foo berfungsi.

Apakah ini bug di SwiftUI atau perilaku yang dirancang? Apakah ada sesuatu yang harus saya lakukan untuk mengatur ulang tampilan ketika saya meninggalkannya?

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

Ini kasus lain dengan masalah yang sama. Saya hanya bisa memilih baris pemilih formulir sekali. Jika saya kembali ke tampilan root dan kemudian kembali lagi ke tampilan ini, saya dapat memilih pemilih lagi.

Jika saya mengatur pickerStyle ke SegmentedPickerStyle (), saya dapat memilihnya beberapa kali.

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

Menjalankan XCode Versi 11.2.1 (11B500) dan iOS 13.3 beta.

Menambahkan ShoppingItemRow untuk informasi lebih lanjut

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
sumber
Bisakah Anda memberikan beberapa contoh data untuk dilihat?
fulvio
1
Menambahkan contoh lain.
adamek
Lebih menarik adalah apa yang ada di dalamnyaShoppingItemRow
Asperi
1
Ini adalah bug dengan NavigationLink dan sangat mudah direproduksi dalam sampel kecil. Lihat posting saya: forums.developer.apple.com/message/395130 . Silakan laporkan ini di Asisten Umpan Balik sehingga pemberitahuan Apple.
Thomas Vos
1
Saya telah melaporkannya di Asisten Umpan Balik.
adamek

Jawaban:

13

Bug ini diperbaiki oleh Apple di iOS 13.3 beta 4. Ingatlah bahwa iOS 13.3 dalam versi beta saat Anda mengujinya. Itu bukan bug di iOS 13.2, jadi ini tidak perlu dikhawatirkan lagi.

Pembaruan untuk rilis iOS 13.3:

Bug diperbaiki pada perangkat fisik tetapi masih ada pada emulator.

Thomas Vos
sumber
Diunduh beta 4. Ya itu sudah diperbaiki.
adamek
4
13,3 kehabisan beta, tapi saya baru saja mengalami masalah. Terjadi pada semua simulator yang menjalankan 13.3 (Telepon dan Bantalan). Belum mengujinya pada perangkat fisik.
executor21
3

Saya memiliki masalah yang sama, lihat posting ini . Masalahnya hanya terjadi pada iPad fisik 9,7 inci. Tidak dengan di simulator, atau di iPhone saya.

simibac
sumber
Xcode: 11.3; iOS 13.3.1 Bagi saya, tidak bekerja melalui simulator tetapi bekerja dengan perangkat.
Frederick C. Lee