swiftui - 为什么绑定(bind)到 Picker 在 swiftui 中不再起作用?

标签 swiftui

当我在模拟器或 Canvas 中运行选择器代码时,选择器总是返回到带有动画的第一个选项或只是卡住。这种情况从上周四/周五开始就发生了。所以我检查了一些旧的简单代码,之前它可以工作,但它也不适合我。 这是简单的旧代码。它在 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("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)!) 因为它不能与可选一起使用。

最佳答案

答案总结:

  1. 使用选项后面的 .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 - 为什么绑定(bind)到 Picker 在 swiftui 中不再起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57305372/

    相关文章:

    SwiftUI:如何强制将HStack中的特定 View 置于中心

    ios - SwiftUI HStack不会达到最高水平吗?

    xcode - 将 ObservedObject 传递给嵌套 subview SwiftUI(SwiftUI 数据流)

    ios - 响应 SwiftUI 中的按键事件

    ios - 表单中的选取器在SwiftUI中留下了领先的空间

    swift - 如何在 SwiftUI 中向 Viewmodifiers 添加闭包?

    ios - 用于 SwiftUI 预览的 Xcode Canvas 未显示

    swift - 如何显示来自已知图像路径的图像 - SwiftUI

    SwiftUI Zstack – 使元素忽略安全区域而另一个不

    swift - 如何在 SwiftUI 中使用属性化字符串