当我在模拟器或 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/

    10-10 01:50