问题分析
在学习Picker的过程中,发现Picker的选取范围和实际绑定的变量存在不一致的问题。
根据下面的代码可以看到,我想要设置MulRange变量的范围为2到12,但实际上Picker选择器默认选择的是4,而Text输出的MulRange的变量却是2,导致Picker选取和绑定的范围不一样。
@State private var MulRange: Int = 2
Picker("范围",selection: $MulRange) {
ForEach(2..<13) { mul in
Text("\(mul)") // Picker默认选择显示为4
}
}
.pickerStyle(WheelPickerStyle())
Text("你选择的乘法范围是: \(MulRange)") // 这里输出的却是2
解决方案
这里先简单的阐述一下问题的根源:
因为我们的ForEach是从2到12的范围,而MulRange为0时,Picker选择器绑定的MulRange也是从0开始的,但因为ForEach是从2开始的,所以Picker选择器的2绑定的就是0。
这个对应关系可以理解为:
从上面的表格对应关系上,我们可以看到。无论你的初始值多少,都是从0到10的对应表。这是因为我们Picker选择器只有10位,所以Picker范围即使是100-120,那么Picker的100对应的初始值也是0。
所以根据MulRange的值,来调整Picker选择器的默认选择值,但并不是Picker选择的值就跟MulRange的值所对应。
因此,这个问题的原因在于使用 ForEach(2..<13) 时,没有给ForEach中生成的值指定唯一标识符。我们需要使用id:\.self明确告诉Swift,每个数字都是唯一标识符,这样Picker就能明确的对应MulRange的值了。
ForEach(2..<13,id: \.self) { mul in
Text("\(mul)")
}
问题完结。