iOS16中TextField输入触发Picker无效选择警告的原因排查
问题原因及解决办法
警告产生的核心原因
你的Picker绑定的monthsPickerValue初始值设为了0,但ForEach(1 ..< maxMonths, id: \.self)生成的选项,其默认关联的tag值范围是1到19(SwiftUI会自动把ForEach遍历的元素作为选项的tag)。当你在TextField输入内容时,视图会触发重绘,此时Picker会检查绑定的选择值0,发现没有任何选项的tag能与之匹配,因此输出这条无效选择的警告。
另外iOS16对ForEach的非字面量范围要求更严格,必须显式指定id,这也是你最初需要添加id: \.self的原因,但这个操作并没有解决选择值和选项tag不匹配的根本问题。
修复方案
有两种直接的修复方式:
- 调整初始值:把
monthsPickerValue的初始值改为范围内的有效值(比如1),让它和某个选项的tag对应:@State private var monthsPickerValue = 1 - 显式指定tag并补充对应选项:如果需要保留初始值
0,可以给每个选项手动添加tag,同时补充一个对应0的选项:Picker("", selection: $monthsPickerValue) { Text("不重复") .tag(0) ForEach(1 ..< maxMonths, id: \.self) { num in Text(num == 1 ? "Repeats every 1 month" : "Repeats every \(num) months") .tag(num) } }
内容的提问来源于stack exchange,提问作者fs_tigre
相关产品推荐
相关产品推荐

