Обновление представления SwiftUI при изменении значения местоположения из ViewModel - PullRequest
0 голосов
/ 06 апреля 2020

Hy,

У меня есть приложение, в котором я хочу получить текущее местоположение пользователя для автозаполнения местоположения в TextField и, если оно не является правильным, чтобы позволить пользователю написать желаемое местоположение.

Что я пробовал:

final class ViewModel: NSObject, ObservableObject, CLLocationManagerDelegate {
      var locationManager: CLLocationManager

      public let objectWillChange = PassthroughSubject<String,Never>()

      public private(set) var latestLocation: String = "" {
            willSet {
                objectWillChange.send(newValue)
            }
       }

       override init() {
         locationManager = CLLocationManager()
         super.init()
         locationManager.delegate = self
         locationManager.desiredAccuracy = kCLLocationAccuracyBest
         locationManager.requestWhenInUseAuthorization()

         if CLLocationManager.locationServicesEnabled(){
             locationManager.startUpdatingLocation()
          }
        }   

       func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
          let userLocation :CLLocation = locations[0] as CLLocation

           let geocoder = CLGeocoder()
           geocoder.reverseGeocodeLocation(userLocation) { (placemarks, error) in
                 if (error != nil){
                  print("error in reverseGeocode")
         }

          let placemark = placemarks! as [CLPlacemark]

          if placemark.count>0 {
            let placemark = placemarks![0]

            self.latestLocation = "\(String(describing: placemark.locality))"
            }
        }   
}

И это файл SwiftUI:

struct FormView: View {
      @ObservedObject var viewModel: ViewModel = ViewModel()

          @State private var location: String = ""

          var body: some View {
               return Form {

                     TextField(title: $location) 
                           .onReceive(self.viewModel.objectWillChange) { value in
                               self.location = value
                           }                    
               }
I ALSO TRYIED THIS:
    //        .onReceive(self.viewModel.$latestLocation) { value in
    //            self.location = value
                  }
    }

Я вижу, что местоположение обновляется сначала во View, а затем в ViewModel , так что всегда мой текст TextField пуст.

1 Ответ

0 голосов
/ 07 апреля 2020

как насчет, если вы используете

TextField(location, text: $location)

, TextField все еще пусто?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...