如何根据布尔值 (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) 更改对象的绑定源?的主要内容,如果未能解决你的问题,请参考以下文章

根据布尔值更改 Xamarin 表单标签的文本

SwiftUI:如何根据滚动视图的用户当前滚动位置同步/更改进度条进度?

更改布尔值时无法在 SwiftUI 中更改按钮文本

SwiftUI - 如何切换核心数据中的所有布尔值

SwiftUI 绑定布尔 if 语句(无法将类型 'Binding<Bool>' 的值转换为预期的条件类型 'Bool')

如何在 SwiftUI 中使用 CoreData 更改数据值?