提问人:Qwertytops 提问时间:6/29/2023 更新时间:6/29/2023 访问量:65
SwiftUI 选取器未显示所选值
SwiftUI Picker not showing selected value
问:
我知道还有其他关于这个问题的问题,但他们都没有回答这个问题。
有两种略有不同的情况会导致相同的行为:对选取器选项使用枚举,以及使用数组。应用已成功生成,没有错误或警告。
我尝试了几种不同的 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 对行为没有影响。
答:
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 的类型,事实证明,从技术上讲,这些类型不是同一类型。
评论
track
Picker("", selection: $track)
tyre
Picker("", selection: $tyre)
type
tag(...)