首页 > 解决方案 > 选择器控件绑定到索引而不是标记

问题描述

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

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

当我

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

标签: iosswiftswiftuiwatchos

解决方案


问题是循环不认为原始类型是可识别的。因此,您需要将标识符明确定义为原始值,如下所示:

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

关键的补充是:

id:\.self

推荐阅读