SwiftUI 选取器未显示所选值

SwiftUI Picker not showing selected value

提问人:Qwertytops 提问时间:6/29/2023 更新时间:6/29/2023 访问量:65

问:

我知道还有其他关于这个问题的问题,但他们都没有回答这个问题。

有两种略有不同的情况会导致相同的行为:对选取器选项使用枚举,以及使用数组。应用已成功生成,没有错误或警告。

我尝试了几种不同的 Picker 代码变体,但没有一个有效。

下面是使用数组的 Picker:

Text("Track")
                    Picker("", selection: $track) {
                        ForEach(tracks, id: \.self) { t in
                            Text(t.name).tag(t)
                            }
                    }
                    .labelsHidden()

这是数组:

let tracks = [Track(name: "Portimao", length: 4.692, downforce: Rating.High, grip: Rating.Low, wear: Rating.High, fuel: Rating.Medium, pitTime: 15.5)]

另一个非常相似:

Text("Tyre")
                    Picker("", selection: $tyre) {
                        ForEach(TyreType.allCases, id: \.self) { tyre in
                            Text(String(describing: tyre)).tag(tyre)
                            }
                    }
                    .labelsHidden()
enum TyreType: CaseIterable, Identifiable {
    var id: TyreType {self}
    case Wet
    case ExtraSoft
    case Soft
    case Medium
    case Hard
}

当我尝试使用任一选取器选择一个选项时,所有选项都会显示并可供选择,但是当它被选中时,选取器再次变为空白。

.tag() 和 .self 对行为没有影响。

swift 枚举 swiftui-foreach swiftui-picker

评论

0赞 Sweeper 6/29/2023
请举一个最小的可重现示例。我无法重现该问题。
0赞 workingdog support Ukraine 6/29/2023
你能展示一下你是如何在 和 中声明的吗?它们需要与您使用的相同。trackPicker("", selection: $track)tyrePicker("", selection: $tyre)typetag(...)

答:

0赞 workingdog support Ukraine 6/29/2023 #1

下面是一些示例代码,演示如何使用问题中显示的选取器。

请注意,选取器选择变量的类型必须与您使用的类型相同 在拾取器中。.tag()

// for testing
struct Track: Hashable {
    var name: String
    var length: Double
    //....
}

struct ContentView: View {
    // for testing
    let tracks = [Track(name: "Portimao", length: 4.692),
                  Track(name: "aaa", length: 123),
                  Track(name: "bbb", length: 456),
                  Track(name: "ccc", length: 789)]
    
    @State var track: Track = Track(name: "Portimao", length: 4.692) 
    @State var tyre: TyreType = TyreType.ExtraSoft
    
    var body: some View {
        
        Text("Selected track: \(track.name)")
        Picker("", selection: $track) {
            ForEach(tracks, id: \.self) { t in
                Text(t.name).tag(t)
            }
        }.labelsHidden()
        
        Text("Selected tyre: \(tyre.rawValue)")
        Picker("", selection: $tyre) {
            ForEach(TyreType.allCases, id: \.self) { tyre in
                Text(String(describing: tyre)).tag(tyre)
            }
        }.labelsHidden()
    }
}

enum TyreType: String, CaseIterable, Identifiable {
    var id: TyreType {self}
    case Wet
    case ExtraSoft
    case Soft
    case Medium
    case Hard
}

评论

0赞 Qwertytops 6/29/2023
谢谢。我在选择字段中使用了可为 null 的类型,事实证明,从技术上讲,这些类型不是同一类型。