无法从 Swiftui 中的 Picker 获取选定值

Unable to get selected value from Picker in Swiftui

我正在尝试创建一个包含一些文本和选择器视图的模型视图。选择器视图是有条件的,并且基于状态变量进行切换。 Toggle 工作正常,但我无法查看选定的值。我使用的是简单的选择器,无法看到选定的值

点击温度值时,所选值不显示任何内容。 有什么想法吗?

   import SwiftUI

struct AddTemperature1: View {
    @Environment(\.presentationMode) var presentationMode
    @State var selection: String = ""
    @State var selectedTemperature : String = ""
    @State var showHideWheel: Bool = false
    
    
    var body: some View {
        
        VStack {
            HStack {
                Text("Temperature")
                    .foregroundColor(Color.gray)
                    .font(.custom("Heavy Condensed", size: 20))
                    .padding()
                
                HStack{
                    Button(action: {
                        self.showHideWheel.toggle()
                    }){
                        Text(selectedTemperature.count > 0 ? selectedTemperature : "Select")
                            .foregroundColor(Color.cclBrandBlueColor)
                            .font(.custom("Heavy Condensed", size: 20))
                        //.padding()
                        Image(systemName: "chevron.right")  .foregroundColor(Color.cclBrandBlueColor)
                            .padding(.trailing)
                    }
                }
                .frame(width: (UIScreen.main.bounds.width - 60) / 2, alignment: .trailing)
                .padding()
            }.background(Color("Color1"))
                .cornerRadius(15)
                .padding(\[.top, .bottom\],10)
                .shadow(color: Color.black.opacity(0.1), radius: 5, x: 8, y: 8)
                .shadow(color: Color.white.opacity(0.5), radius: 5, x: -8, y: -8)
            Spacer()
            if self.showHideWheel {
                VStack (alignment: .center){
                    
                    // VStack{
                    Picker(selection: $selection, label: Text("")){
                        ForEach(50...120, id:\.self){ i in
                            Text("\(i)").tag(i)
                        }
                    }.labelsHidden()
                    Text("You selected: \(selection)")
                    
                }.background(Color("Color1"))
                    .cornerRadius(25)
                    .frame(width: (UIScreen.main.bounds.width - 20), alignment: .center)
                    
                    // .padding(\[.top, .bottom\],10)
                    .shadow(color: Color.black.opacity(0.1), radius: 5, x: 8, y: 8)
                    .shadow(color: Color.white.opacity(0.2), radius: 5, x: -8, y: -8)
            }
        }.frame(width: UIScreen.main.bounds.width)
            .background(Image("background").resizable().scaledToFill().clipped())
        
        
    }
}

struct AddTemperature1_Previews: PreviewProvider {
    static var previews: some View {
        AddTemperature1()
    }
}]

ForEach 列表 50...120 由整数组成,而不是字符串。所以你的 selection 需要是一个 Int,而不是一个 String。这是对您的示例的重写:

struct ContentView: View {
    @State var selection : Int = 50
    var body: some View {
        VStack (alignment: .center){
            Picker("", selection: $selection){
                ForEach(50...120, id:\.self){ i in
                    Text(String(i))
                }
            }.labelsHidden()
            Text("You selected: \(selection)")
        }
    }
}

如果您真的希望 selection 是一个字符串,您的 ForEach 列表也需要是字符串:

struct ContentView: View {
    @State var selection : String = "50"
    var body: some View {
        VStack (alignment: .center){
            Picker("", selection: $selection){
                ForEach((50...120).map(String.init), id:\.self){ i in
                    Text(i)
                }
            }.labelsHidden()
            Text("You selected: \(selection)")
        }
    }
}