如何根据布尔值 (SwiftUI) 更改对象的绑定源?
Posted
技术标签:
【中文标题】如何根据布尔值 (SwiftUI) 更改对象的绑定源?【英文标题】:How do I change an object's binding source based on a boolean (SwiftUI)? 【发布时间】:2020-01-27 05:08:00 【问题描述】:我有一个ObservedObject
,我根据来自表单TextFields
的用户输入将值传递给它。但是,我希望用户可以选择使用 CoreLocation。当他们更改切换时,我希望TextFields
之一的输入值切换到我的CoreLocation
发布者。这是sn-ps的代码:
@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 是 显示变化的速度,所以我确信位置发布者正在工作。我不清楚这里如何更改绑定源。
【问题讨论】:
【参考方案1】:我不确定我是否理解您的目标,但您可能期望以下内容...
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)
【讨论】:
【参考方案2】:@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 为我指明了正确的方向。
【讨论】:
以上是关于如何根据布尔值 (SwiftUI) 更改对象的绑定源?的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI:如何根据滚动视图的用户当前滚动位置同步/更改进度条进度?
SwiftUI 绑定布尔 if 语句(无法将类型 'Binding<Bool>' 的值转换为预期的条件类型 'Bool')