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