SwiftUI-为什么此选择器的值变为“ x – 2”?

Spi*_*elo 0 ios swift swiftui

我可以使用以下选择器选择事件应多久发生一次:

struct RecurrenceSelector: View {   
@State var interval = 1

var body: some View {
        NavigationView {
            Form {
                Section {
                    Picker("Every", selection: $interval) {
                        Text("1 week").tag(1)
                        ForEach(2 ..< 1000) { weeks in
                            Text("\(weeks) weeks")
                                .tag(weeks)
                        }
                        }.pickerStyle(WheelPickerStyle())
                }
            }
        }
    .onDisappear(perform: updateRruleString)
    }

private func updateRruleString() {
        print("INTERVAL: \(self.interval)")
    }
}
Run Code Online (Sandbox Code Playgroud)

关闭视图时,如果将“选择器”设置为5周,则将打印INTERVAL:3。如果将其设置为20周,则将打印INTERVAL:18。

我不知道为什么值要减去2。

(为了简洁起见,我已经缩短了代码,但是当我注释掉所有其他代码时,它的行为方式相同)。这是它的样子(看起来像我期望的那样)

Joh*_* M. 5

TL; DR

替换ForEach(2 ..< 1000)ForEach(2 ..< 1000, id: \.self)

说明

ForEach有几个初始化程序。您正在使用

init(_ data: Range<Int>, @ViewBuilder content: @escaping (Int) -> Content)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,选择interval对应于您选择的索引;由于您的范围从2开始,索引从0开始,因此您的选择interval将始终偏离2。

如果您将初始化程序与id参数一起使用,

init(_ data: Data, id: KeyPath<Data.Element, ID>, content: @escaping (Data.Element) -> Content)
Run Code Online (Sandbox Code Playgroud)

那么您的选择对应于element而不是索引。因此,您的interval属性将对应于显示的值。