ไม่สามารถเลือกแถวเดียวกันสองครั้งใน SwiftUI


19

ฉันมีรายการการนำทางที่มีหลายส่วนและหลายแถว ฉันเลือกแถว foo มันนำทางไปยังมุมมองที่ฉันต้องการ อย่างไรก็ตามเมื่อฉันกลับไปที่รูทวิวฉันไม่สามารถเลือกแถวฟูได้ ฉันแตะแถวฟูและไม่มีอะไรเกิดขึ้น

ฉันแตะที่แถบแถวและแถวนั้นจะส่งฉันไปที่มุมมอง กลับไปที่มุมมองรูต จากนั้นฉันไม่สามารถเลือกแถวบาร์ได้ แต่ตอนนี้แถว foo ใช้ได้ผล

นี่เป็นข้อบกพร่องใน SwiftUI หรือลักษณะการออกแบบหรือไม่ มีบางอย่างที่ฉันต้องทำเพื่อรีเซ็ตมุมมองเมื่อฉันออกไปหรือไม่

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

นี่เป็นอีกกรณีหนึ่งที่มีปัญหาเดียวกัน ฉันสามารถเลือกแถวตัวเลือกของแบบฟอร์มหนึ่งครั้งเท่านั้น ถ้าฉันกลับไปที่มุมมองรูทแล้วกลับมาที่มุมมองนี้อีกครั้งฉันสามารถเลือกตัวเลือกได้อีกครั้ง

หากฉันตั้ง pickerStyle เป็น SegmentedPickerStyle () ฉันสามารถเลือกได้หลายครั้ง

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 เวอร์ชัน 11.2.1 (11B500) และ iOS 13.3 เบต้า

การเพิ่ม ShoppingItemRow สำหรับข้อมูลเพิ่มเติม

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

}

คุณสามารถให้ข้อมูลตัวอย่างเพื่อดูได้หรือไม่?
fulvio

1
เพิ่มอีกตัวอย่าง
adamek

สิ่งที่น่าสนใจกว่าคือสิ่งที่อยู่ข้างในShoppingItemRow
Asperi

1
มันเป็นข้อผิดพลาดกับ NavigationLink และง่ายมากที่จะทำซ้ำในตัวอย่างเล็ก ๆ เห็นโพสต์ของฉัน: forums.developer.apple.com/message/395130 โปรดรายงานสิ่งนี้ในผู้ช่วยติชมเพื่อแจ้งให้ Apple ทราบ
โทมัส Vos

1
ฉันได้รายงานไว้ใน Feedback Assistant แล้ว
adamek

คำตอบ:


13

ปัญหาได้รับการแก้ไขโดย Apple ใน iOS 13.3 เบต้า 4 โปรดทราบว่า iOS 13.3 เป็นรุ่นเบต้าในขณะที่คุณทำการทดสอบ ไม่ใช่ข้อบกพร่องใน iOS 13.2 ดังนั้นจึงไม่ต้องกังวลอีกต่อไป

อัปเดตสำหรับรุ่น iOS 13.3:

ข้อผิดพลาดได้รับการแก้ไขในอุปกรณ์ทางกายภาพ แต่ยังคงอยู่ในโปรแกรมจำลอง


ดาวน์โหลด beta 4 ใช่แล้วมันแก้ไขได้
adamek

4
13.3 เป็นรุ่นเบต้า แต่ฉันเพิ่งพบปัญหา เกิดขึ้นกับตัวจำลองการทำงานทั้งหมด 13.3 (โทรศัพท์และแผ่นอิเล็กโทรด) ยังไม่ได้ทดสอบกับอุปกรณ์ทางกายภาพ
executor21

3

ฉันมีปัญหาเดียวกันดูโพสต์นี้นี้ ปัญหาเกิดขึ้นเฉพาะกับ iPad จริง 9.7 นิ้ว ไม่ได้อยู่ในโปรแกรมจำลองหรือบน iPhone ของฉัน


Xcode: 11.3; iOS 13.3.1 สำหรับฉันไม่ทำงานผ่านอุปกรณ์จำลอง แต่ทำงานได้กับอุปกรณ์
เฟรดเดอริกซี. ลี
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.