【问题标题】:Cannot assign value of type 'Double' to type 'Binding<Double>'无法将类型“Double”的值分配给类型“Binding<Double>”
【发布时间】:2021-04-29 06:03:45
【问题描述】:

我希望用户通过选择器选择他的身高。然后想以英寸或厘米为单位将用户的身高记录到我的 ContenvtView 结构中的 Double 变量中。但是,不能为我的@Binding Double 分配任何值。 Xcode 在标题上大喊大叫,或者说我不能将 Double 分配给 Binding。我错过了什么?代码如下:

结构高度选择器:查看 {

        @State var foot = 0.0
        @State var inch = 0.0
        @State var meter = 0.0
        @State var cm = 0.0
        @State var measurement = ""
        @Binding var metric: Bool
        @Binding var height: Double
        

        var feet = [Int](0..<10)
        var inches = [Int](0..<12)
        var meters = [Int](0..<3)
        var cms = [Int](0..<100)
        var measurements = ["in", "cm" ]
        
        var body: some View{
            VStack{
                GeometryReader() { geometry in
                    
                    HStack {
                        
                        if(metric == false) {
                            
                            Picker(selection: self.$foot, label: Text("")) {
                                ForEach(0 ..< self.feet.count){ index in
                                    Text("\(self.feet[index])").tag(self.feet[index])
                                }
                            }
                            .frame(width: geometry.size.width/4,height: geometry.size.height, alignment: .center)
                            .clipped()
                            .scaleEffect(CGSize(width: 1.0, height: 1.0))
                            .pickerStyle(WheelPickerStyle())
                            .scaledToFit()
                            .background(Color.white)
                            
                            Text("\"")
                            
                            
                            Picker(selection: self.$inch, label: Text("")) {
                                ForEach(0 ..< self.inches.count){ index in
                                    Text("\(self.inches[index])").tag(self.inches[index])
                                }
                            }
                            .frame(width: geometry.size.width/4,height: geometry.size.height, alignment: .center)
                            .clipped()
                            .scaleEffect(CGSize(width: 1.0, height: 1.0))
                            .pickerStyle(WheelPickerStyle())
                            .scaledToFit()
                            .background(Color.white)

                            var heightInches = (self.foot * 12) + self.inch
                            
                     
                            
                            
                        
                            Text("'")
                        
                            self.$height = heightInches
                            
                        } else if(metric == true) {
                            Picker(selection: self.$meter, label: Text("")) {
                                ForEach(0 ..< self.meters.count){ index in
                                    Text("\(self.meters[index])").tag(self.meters[index])
                                }
                            }
                            .frame(width: geometry.size.width/4, height: geometry.size.height, alignment: .center)
                            .scaleEffect(CGSize(width: 1.0, height: 1.0))
                            .clipped()
                            .pickerStyle(WheelPickerStyle())
                            .scaledToFit()
                            .background(Color.white)

                            
                            Text("m")
                            
                            
                            Picker(selection: self.$cm, label: Text("")) {
                                ForEach(0 ..< self.cms.count){ index in
                                    Text("\(self.cms[index])").tag(self.cms[index])
                                }
                            }
                            .frame(width: geometry.size.width/4,height: geometry.size.height, alignment: .center)
                            .clipped()
                            .scaleEffect(CGSize(width: 1.0, height: 1.0))
                            .pickerStyle(WheelPickerStyle())
                            .scaledToFit()
                            .background(Color.white)

                            Text("cm")


                        }
                        
                    }
              
                    
                }.frame(height: 45)
            }
            .frame(height: 45)
            .padding(.top,5)
            .padding(.bottom, 5)
            
        }
    }

}

【问题讨论】:

  • self.height = heightInches 呢?

标签: swift swiftui binding


【解决方案1】:

您不能只在视图中间执行此操作:

var heightInches = (self.foot * 12) + self.inch
self.$height = heightInches
                        

试试这个例子:

struct HeightPicker: View {
    
    @State var foot: Int = 0    // <---
    @State var inch: Int = 0    // <---
    @State var meter: Int = 0   // <---
    @State var cm: Int = 0  // <---
    @State var measurement = ""
    
    @Binding var metric: Bool
    @Binding var height: Double
    
    var feet = [Int](0..<10)
    var inches = [Int](0..<12)
    var meters = [Int](0..<3)
    var cms = [Int](0..<100)
    var measurements = ["in", "cm" ]
    
    var body: some View{
        VStack{
            GeometryReader() { geometry in
                
                HStack {
                    
                    if !metric {    // <---
                        
                        Picker(selection: self.$foot, label: Text("")) {
                            ForEach(0 ..< self.feet.count){ index in
                                Text("\(self.feet[index])").tag(self.feet[index])
                            }
                        }
                        // add this
                        .onChange(of: foot) { _ in
                            self.height = Double(self.foot * 12 + self.inch)
                            print("--> height: \(height)")
                        }
                        .frame(width: geometry.size.width/4,height: geometry.size.height, alignment: .center)
                        .clipped()
                        .scaleEffect(CGSize(width: 1.0, height: 1.0))
                        .pickerStyle(WheelPickerStyle())
                        .scaledToFit()
                        .background(Color.white)
                        
                        Text("\"")
                        
                        Picker(selection: self.$inch, label: Text("")) {
                            ForEach(0 ..< self.inches.count){ index in
                                Text("\(self.inches[index])").tag(self.inches[index])
                            }
                        }
                        // add this
                        .onChange(of: inch) { _ in
                            self.height = Double(self.foot * 12 + self.inch)
                            print("--> height: \(height)")
                        }
                        .frame(width: geometry.size.width/4,height: geometry.size.height, alignment: .center)
                        .clipped()
                        .scaleEffect(CGSize(width: 1.0, height: 1.0))
                        .pickerStyle(WheelPickerStyle())
                        .scaledToFit()
                        .background(Color.white)
 
                        Text("'")

                    } else {
                        Picker(selection: self.$meter, label: Text("")) {
                            ForEach(0 ..< self.meters.count){ index in
                                Text("\(self.meters[index])").tag(self.meters[index])
                            }
                        }
                        .frame(width: geometry.size.width/4, height: geometry.size.height, alignment: .center)
                        .scaleEffect(CGSize(width: 1.0, height: 1.0))
                        .clipped()
                        .pickerStyle(WheelPickerStyle())
                        .scaledToFit()
                        .background(Color.white)
                        
                        Text("m")
                        
                        Picker(selection: self.$cm, label: Text("")) {
                            ForEach(0 ..< self.cms.count){ index in
                                Text("\(self.cms[index])").tag(self.cms[index])
                            }
                        }
                        .frame(width: geometry.size.width/4,height: geometry.size.height, alignment: .center)
                        .clipped()
                        .scaleEffect(CGSize(width: 1.0, height: 1.0))
                        .pickerStyle(WheelPickerStyle())
                        .scaledToFit()
                        .background(Color.white)
                        
                        Text("cm")
                    }
                }
            }.frame(height: 45)
        }
        .frame(height: 45)
        .padding(.top,5)
        .padding(.bottom, 5)
    }
}

【讨论】:

  • 如果这回答了您的问题,请点击帖子旁边的复选标记。
猜你喜欢
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
相关资源
最近更新 更多