Swift UI Picker绑定状态显示不一致问题
Swift UI Picker绑定状态显示不一致问题

Swift UI Picker绑定状态显示不一致问题

问题分析

在学习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)")
}

问题完结。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注