Không thể chọn cùng một hàng hai lần trong SwiftUI


19

Tôi có một danh sách điều hướng với nhiều phần và hàng. Tôi chọn một hàng foo, nó điều hướng đến chế độ xem tôi muốn. Tuy nhiên, khi tôi quay lại chế độ xem gốc, tôi không thể chọn hàng foo. Tôi gõ hàng foo và không có gì xảy ra.

Tôi nhấn vào thanh hàng và hàng đó sẽ đưa tôi đến chế độ xem. Quay lại chế độ xem gốc. Sau đó, tôi không thể chọn thanh hàng, nhưng bây giờ hàng foo hoạt động.

Đây có phải là một lỗi trong SwiftUI hoặc hành vi được thiết kế? Có điều gì tôi cần làm để thiết lập lại lượt xem khi tôi rời khỏi chúng không?

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

Đây là một trường hợp khác với cùng một vấn đề. Tôi chỉ có thể chọn hàng chọn của mẫu một lần. Nếu tôi quay lại chế độ xem gốc và sau đó quay lại chế độ xem này, tôi có thể chọn lại trình chọn.

Nếu tôi đặt bộ chọnStyle thành SegmentedPickerStyle (), tôi có thể chọn nó nhiều lần.

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

Chạy XCode Phiên bản 11.2.1 (11B500) và iOS 13.3 beta.

Thêm ShoppingItemRow để biết thêm thông tin

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

}

Bạn có thể cung cấp một số dữ liệu mẫu để xem xét?
Fulvio

1
Thêm một ví dụ khác.
adamek

Chi tiết thú vị là những gì bên trongShoppingItemRow
Asperi

1
Đó là một lỗi với NavigationLink và rất dễ tái tạo trong mẫu nhỏ. Xem bài đăng của tôi: forum.developer.apple.com/message/395130 . Vui lòng báo cáo điều này trong Trợ lý phản hồi để Apple thông báo.
Thomas Vos

1
Tôi đã báo cáo nó trong Feedback Assistant.
adamek

Câu trả lời:


13

Lỗi được Apple sửa trong iOS 13.3 beta 4. Hãy nhớ rằng iOS 13.3 đã ở giai đoạn thử nghiệm tại thời điểm bạn thử nghiệm. Đó không phải là một lỗi trong iOS 13.2, vì vậy điều này không còn gì phải lo lắng nữa.

Bản cập nhật cho bản phát hành iOS 13.3:

Lỗi được sửa trên các thiết bị vật lý nhưng vẫn hiện diện trên trình giả lập.


Đã tải xuống bản beta 4. Có nó đã sửa nó.
adamek

4
13.3 đã hết beta, nhưng tôi mới gặp phải sự cố. Xảy ra trên tất cả các trình giả lập chạy 13.3 (Điện thoại và Tấm lót). Chưa thử nghiệm nó trên một thiết bị vật lý nào.
chấp hành viên

3

Tôi có cùng một vấn đề, xem bài này . Sự cố chỉ xảy ra trên iPad 9.7 inch vật lý. Không phải trong trình giả lập, cũng không phải trên iPhone của tôi.


Xcode: 11.3; iOS 13.3.1 Đối với tôi, không hoạt động thông qua trình giả lập mà hoạt động với thiết bị.
Frederick C. Lee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.