这段代码不起作用,这意味着onChange永远不会被调用,并且当选择了一个选项时,变量不会被更改。
struct ExamplePicker: View {
@State var val: Int32 = 2
var body: some View {
HStack {
Menu {
Picker(selection: $val, label: EmptyView()) {
Text("Val1").tag(1)
Text("Val2").tag(2)
Text("Val3").tag(3)
}
} label: {
HStack {
Text("Value: ")
Spacer()
Text(String(format: "%d", val))
Spacer()
}
}
.onChange(of: val) { newSelection in
print(">>> HERE")
}
}
}
}
但是如果你把瓦尔改为Int类型,它会工作得很好。我看这像个窃听器
编辑:解决了-问题是在.tag()中你需要完全相同的类型。所以.tag(1)应该是Int而不是Int 32。因此需要.tag(Int 32(1))
只是为了让它更混乱,这是有效的:
struct ExamplePicker: View {
@Binding var val: Int64
var body: some View {
HStack {
Picker(selection: $val, label: EmptyView()) {
Text("Val1").tag(1)
Text("Val2").tag(2)
Text("Val3").tag(3)
}
.onChange(of: val) { newSelection in
print(">>> HERE")
}
}
}
}
2条答案
按热度按时间pgccezyw1#
当
Picker
项的tag
值与状态变量的类型相同时,它可以正常工作。就像这样:n3h0vuf22#
当执行
.tag(1)
时,1
的类型是Int
。tag
不知道你传递给selection:
的Binding
是什么类型的-任何Hashable
的东西都可以在那里:通过类型推断,
tag(1)
中的1
被推断为Int
,因为我重复一遍,tag
对selection:
一无所知。因此
selection:
绑定的类型与标记的类型不同。这意味着当你在选择器中选择某个东西时,SwiftUI不知道它应该将选择值更改为什么。出于同样的原因,它也不知道当前选择了哪个选项。要使
Int32
选择工作,明确地说1
,2
,3
等是Int32
s: