SwiftUI에서 동일한 행을 두 번 선택할 수 없습니다


19

여러 섹션과 행이있는 탐색 목록이 있습니다. foo 행을 선택하면 원하는보기로 이동합니다. 그러나 루트보기로 돌아 가면 foo 행을 선택할 수 없습니다. 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이 통지 할 수 있도록 피드백 지원에이를보고하십시오.
Thomas Vos

1
피드백 지원에서보고했습니다.
adamek

답변:


13

버그는 iOS 13.3 베타 4에서 Apple에 의해 수정되었습니다. iOS 13.3은 테스트 당시 베타 버전이었습니다. iOS 13.2에서는 버그가 아니므로 더 이상 걱정할 것이 없습니다.

iOS 13.3 릴리스 용 업데이트 :

버그는 물리적 장치에서 수정되었지만 여전히 에뮬레이터에 있습니다.


베타 4를 다운로드했습니다. 예. 수정했습니다.
adamek

4
13.3은 베타 버전이 아니지만 방금 문제가 발생했습니다. 13.3 (전화 및 패드)을 실행하는 모든 시뮬레이터에서 발생합니다. 실제 장치에서 아직 테스트하지 않았습니다.
executor21

3

나는 같은 문제가있다,이 게시물을 참조하십시오 . 실제 iPad 9.7 인치에서만 문제가 발생합니다. 시뮬레이터 나 내 iPhone에는 없습니다.


Xcode : 11.3; iOS 13.3.1 나에게 시뮬레이터를 통해 작동하지 않지만 장치와 작동합니다.
Frederick C. Lee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.