我希望用户通过选择器选择他的身高。然后想将用户的身高(以英寸或厘米为单位)记录到我的 ContenvtView 结构中的 Double 变量中。但是,不能为我的 @Binding Double 分配任何值。 Xcode 在标题上大喊大叫,或者说我无法将 Double 分配给 Binding。我错过了什么?代码如下:
struct HeightPicker:视图 {
@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)
}
}
}
答案 0 :(得分:0)
您不能只在视图中间执行此操作:
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)
}
}