当我在模拟器或 Canvas 中运行Picker Code时,Picker总是返回带有动画的第一个选项,或者只是卡住。从上周四/周五开始发生。因此,我检查了一些旧的简单代码,在此之前它在哪里可以工作,在那里对我也不起作用。
这是简单的旧代码。在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
,但是在这里它也不起作用。另外,我没有任何错误,它可以构建和运行。
谢谢您的指点。
---- 编辑 ----- 请先看看答案
获得帮助后,我可以在所有
.tag()
后面使用Text()
,例如Text("Option 1").tag()
,现在它获取初始值并在 View 内更新它。如果我像这样使用@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)
}
}
}
}
不幸的是,如果我在另一个 View (一个导航链接)中进行了这些更改,它并不能反射(reflect)出值的更改。而且,它似乎与上面的代码(我在其中使用
firstIndex(of: exercise)
的代码)不兼容-编辑-
现在,如果我更改,上面的代码可以工作
Text("\(exercise)").tag(self.data.exercises.firstIndex(of: exercise))
进入Text("\(exercise)").tag(self.data.exercises.firstIndex(of: exercise)!)
因为它不能与可选项一起使用。 最佳答案
答案总结为:
.tag()
即可使用。如下所示: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)
}
}
我不确定是否打算在此处使用
.tag()
,但这至少是一种解决方法。关于swiftui - 为什么在swiftui中绑定(bind)到Picker不再起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57305372/