为什么绑定到选择器在swiftui中不再有效?

为什么绑定到选择器在swiftui中不再有效?,swiftui,Swiftui,当我在模拟器或画布中运行选取器代码时,选取器总是返回到第一个选项并带有动画,或者只是冻结。这是从上周四/周五开始的。所以我检查了一些旧的简单代码,在那之前它在哪里工作,在那里它对我也不起作用。 这是简单的旧代码。它在beta 3、4和5中不再有效 struct PickerView : View { @State var selectedOptionIndex = 0 var body: some View { VStack { Text

当我在模拟器或画布中运行选取器代码时,选取器总是返回到第一个选项并带有动画,或者只是冻结。这是从上周四/周五开始的。所以我检查了一些旧的简单代码,在那之前它在哪里工作,在那里它对我也不起作用。 这是简单的旧代码。它在beta 3、4和5中不再有效

struct PickerView : View {
    @State var selectedOptionIndex = 0

    var body: some View {
        VStack {
            Text("Option: \(selectedOptionIndex)")
            Picker(selection: $selectedOptionIndex, label: Text("")) {
                Text("Option 1")
                Text("Option 2")
                Text("Option 3")
            }
        }
    }
}
在我较新的代码中,我使用了
@ObservedObject
,但在这里它也不起作用。 此外,我没有得到任何错误,它的建设和运行。 谢谢你的指点

----编辑--请先看答案

在帮助之后,我可以在所有
Text()
后面使用
.tag()
,就像
Text(“选项1”).tag()
,现在它接受初始值并在视图中更新它。如果我像下面这样使用
@ObservedObject

struct PickerView: View {
    @ObservedObject var data: Model

    let width: CGFloat
    let height: CGFloat

    var body: some View {
        VStack(alignment: .leading) {
            Picker(selection: $data.exercise, label: Text("select exercise")) {
                    ForEach(data.exercises, id: \.self) { exercise in
                        Text("\(exercise)").tag(self.data.exercises.firstIndex(of: exercise))
                    }
                }
.frame(width: width, height: (height/2), alignment: .center)
            }
       }
    }
}  
不幸的是,它并没有反映对值的更改,如果我在另一个视图中进行这些更改,一个navigationlink会更进一步。而且它似乎也不适用于我上面的代码,我使用了
firstIndex(of:exercise)

---编辑--- 现在,如果我更改,上面的代码就可以工作了
Text(“\(exercise)”).tag(self.data.exercises.firstIndex(of:exercise))
进入
Text(“\(exercise)”).tag(self.data.exercises.firstIndex(of:exercise)!)

因为它不能与可选的一起工作。

答案总结如下:

  • 使用选项后面的
    .tag()
    ,它可以工作。它将如下所示:
  • 如果使用一系列对象,它可能如下所示:
  • Picker(选择:$data.exercises,标签:Text(“”)){
    
    弗雷奇(0..你的数组计数是固定的吗?或者它随时都可能增长?数组计数是固定的。但我也使用选择器来选择计时器的时间量。从技术上讲,计时器启动时它应该倒计时,但现在它不再倒计时了,这不会困扰我。好吧,我看到你发现了
    可选的
    问题。很好!我问了一个问题的原因关于固定数组,是因为如果你知道数组不会改变,你可以使用
    ForEach(0..,这使代码更可读!也感谢你的解释!你还可以使用
    data.exercises.index
    来获得所有索引的范围。只是为了看起来。
    Picker(selection: $selectedOptionIndex, label: Text("")) {
                    ForEach(1...3) { index in
                        Text("Option \(index)").tag(index)
                    }
                }
    
    Picker(selection: $data.exercises, label: Text("")) {
                    ForEach(0..<data.exercises.count) { index in
                        Text("\(data.exercises[index])").tag(index)
                    }
                }