Как изменить источник привязки объекта на основе логического значения (SwiftUI)? - PullRequest
2 голосов
/ 27 января 2020

У меня есть 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. Я подтвердил, что когда Я изменяю переключатель, пользовательский интерфейс равен , показывающий изменение скорости, поэтому я уверен, что издатель местоположения работает. Я не понимаю, как изменить источник привязки здесь.

Ответы [ 2 ]

2 голосов
/ 27 января 2020

Я не уверен, что понял вашу цель, но, вероятно, вы ожидаете что-то вроде следующего ...

   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)
   }
0 голосов
/ 27 января 2020

Ответ, предоставленный @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)
   }

Использование издателя locationManager.objectWillChange в функции onReceive правильно подписалось на изменения.

Спасибо @Asperi за указание на меня в правильном направлении.

...