我一直在努力解决这个问题,但它仍然存在(xcode 14 beta iOS 16)。我想出了这个解决方案,希望能对某些人有所帮助,直到苹果解决此问题。
如果选择的项目不在数组中,则标签将不会显示。因此,我将标签添加到数组中,并使同一标签成为所选项目的值。这将导致标签始终显示,因此当用户单击弹出列表时,如果您想要删除标签,则可以执行此操作。
@State private var items = ["please select an option","Option1","Option2","Option3","Option4","Option5"]
@State private var selectedItem = "please select an option"
var body: some View {
Picker(selection: $selectedItem, label: Text(selectedItem)) {
ForEach(items, id: \.self) {
Text($0)
}
}.onTapGesture(){
if items.contains("please select an option") {
items.remove(at: 0)
}
}
}
如果你有一个自己的对象数组而不是字符串,请使用 Int { hashValue } 作为你的对象的 ID。
struct myStruct: Hashable, Identifiable {
var id: Int { hashValue }
let myValue:String
let myOtherValue:String
}
@State private var structItems = [myStruct(myValue: "0", myOtherValue: "please select an option"),
myStruct(myValue: "1", myOtherValue: "Option1"),
myStruct(myValue: "2", myOtherValue: "Option2"),
myStruct(myValue: "3", myOtherValue: "Option3"),
myStruct(myValue: "4", myOtherValue: "Option4"),
myStruct(myValue: "5", myOtherValue: "Option5")]
@State private var selectedStructItem = myStruct(myValue: "0", myOtherValue: "please select an option")
var body: some View {
Picker(selection: $selectedStructItem, label: Text(selectedStructItem.myOtherValue)) {
ForEach(structItems, id: \.id) { val in
Text(val.myOtherValue).tag(val)
}
}.onTapGesture(){
if structItems.contains(myStruct(myValue: "0", myOtherValue: "please select an option")) {
structItems.remove(at: 0)
}
}
}