如何根据布尔值 (SwiftUI) 更改对象的绑定源?
How do I change an object's binding source based on a boolean (SwiftUI)?
我有一个 ObservedObject
,我根据来自表单 TextFields
的用户输入向其中传递值。但是,我希望用户可以选择使用 CoreLocation。当他们更改开关时,我希望 TextFields
之一的输入值切换到我的 CoreLocation
发布者。以下是代码片段:
@EnvironmentObject var locationManager: LocationManager
@ObservedObject var calculator: CalculatorObject
@State var useGPS: Bool = false
if self.useGPS {
//I'm not sure what to put here
//I’ve tried several options to set the binding element of the
// CalculatorObject to the speed object of the
// locationManager but they don’t change the values within
// the calculations.
}
var body: Some View {
VStack {
Toggle(isOn: $useGPS) {
Text("Use GPS for Ground Speed")
}
if useGPS {
Text(locationManager.locationInfo.speed)
} else {
TextField("Ground Speed", text: self.$calculator.groundSpeed)
}
}
}
我尝试了多种不同的选择,但我似乎无法从位置管理器获取数据以将其数据传递给 CalculatorObject.
我已经验证,当我更改切换开关时,UI 是显示变化速度,所以我确定位置发布者正在工作。我不清楚如何更改这里的绑定源。
我不确定我是否理解您的目标,但您可能希望得到类似以下内容...
if useGPS {
TextField("<Other_title_here>", text: self.$calculator.groundSpeed)
.onAppear {
self.calculator.groundSpeed = locationManager.locationInfo.speed
}
} else {
TextField("Ground Speed", text: self.$calculator.groundSpeed)
}
@Asperi 提供的答案为我指明了正确的方向,但没有与发布者正确合作。这是我所做的最终起作用的:
if useGPS {
TextField("<Other_title_here>", text: self.$calculator.groundSpeed)
.onReceive(locationManager.objectWillChange, perform: { output in
self.calculator.groundSpeed = output.speed
})
} else {
TextField("Ground Speed", text: self.$calculator.groundSpeed)
}
在 onReceive
函数中使用 locationManager.objectWillChange
发布者正确订阅了更改。
感谢@Asperi 为我指明了正确的方向。
我有一个 ObservedObject
,我根据来自表单 TextFields
的用户输入向其中传递值。但是,我希望用户可以选择使用 CoreLocation。当他们更改开关时,我希望 TextFields
之一的输入值切换到我的 CoreLocation
发布者。以下是代码片段:
@EnvironmentObject var locationManager: LocationManager
@ObservedObject var calculator: CalculatorObject
@State var useGPS: Bool = false
if self.useGPS {
//I'm not sure what to put here
//I’ve tried several options to set the binding element of the
// CalculatorObject to the speed object of the
// locationManager but they don’t change the values within
// the calculations.
}
var body: Some View {
VStack {
Toggle(isOn: $useGPS) {
Text("Use GPS for Ground Speed")
}
if useGPS {
Text(locationManager.locationInfo.speed)
} else {
TextField("Ground Speed", text: self.$calculator.groundSpeed)
}
}
}
我尝试了多种不同的选择,但我似乎无法从位置管理器获取数据以将其数据传递给 CalculatorObject.
我已经验证,当我更改切换开关时,UI 是显示变化速度,所以我确定位置发布者正在工作。我不清楚如何更改这里的绑定源。
我不确定我是否理解您的目标,但您可能希望得到类似以下内容...
if useGPS {
TextField("<Other_title_here>", text: self.$calculator.groundSpeed)
.onAppear {
self.calculator.groundSpeed = locationManager.locationInfo.speed
}
} else {
TextField("Ground Speed", text: self.$calculator.groundSpeed)
}
@Asperi 提供的答案为我指明了正确的方向,但没有与发布者正确合作。这是我所做的最终起作用的:
if useGPS {
TextField("<Other_title_here>", text: self.$calculator.groundSpeed)
.onReceive(locationManager.objectWillChange, perform: { output in
self.calculator.groundSpeed = output.speed
})
} else {
TextField("Ground Speed", text: self.$calculator.groundSpeed)
}
在 onReceive
函数中使用 locationManager.objectWillChange
发布者正确订阅了更改。
感谢@Asperi 为我指明了正确的方向。