选择器控件绑定到索引而不是标记

Picker control binds to index and not to tag

我遇到一个问题,我的 Picker 控件绑定到项目的索引,而不是标签中指定的值。我正在使用 WatchOS。

Picker("Hour:", selection: $hour) {
                ForEach((twentyFourHour ?  0 : 1)..<(twentyFourHour ?  24 : 13)) {
                    Text(String(format: twentyFourHour ? "%02d" : "%d", [=10=]))
                        .tag([=10=])
                }
            }

当我

print("p: \(period) hr: \(hr) hour: \(hour)")

我明白了

p: am hr: 0 hour: 0

我已经通过向标签值添加任意值进行了测试,它似乎仍然绑定到索引。我也尝试过使用“{ i in ”语法得到相同的结果。

我基于 Apple 文档: https://developer.apple.com/documentation/swiftui/picker?changes=latest_minor

问题是循环不认为原始类型是可识别的。因此,您需要将标识符显式定义为原始值:

Picker("Hour:", selection: $hour) {
            ForEach((twentyFourHour ?  0 : 1)..<(twentyFourHour ?  24 : 13), id:\.self) {
                Text(String(format: twentyFourHour ? "%02d" : "%d", [=10=]))
                    .tag([=10=])
            }
        }

关键的补充是:

id:\.self