Реализация функции прямого геокодирования в представлении iOS swiftui - PullRequest
0 голосов
/ 23 апреля 2020

Поэтому я пытаюсь создать приложение iOS, использующее swiftui, которое перенаправляет геокодирование адреса, а затем помещает эти координаты в переменные, которые можно использовать в остальных моих представлениях. Функция, которую я использую для прямого геокодирования, выглядит следующим образом:

import SwiftUI
import CoreLocation

struct ContentView: View {
    @State var myText = "Some Text just for reference"
    @State var location: CLLocationCoordinate2D?
    @State var lat: Double?
    @State var long: Double?

    var body: some View {
        VStack{
        Text(myText)
                  .onAppear {
                      self.getLocation(from: "22 Sunset Ave, East Quogue, NY") { coordinates in
                          print(coordinates ?? 0) // Print here
                          self.location = coordinates // Assign to a local variable for further processing
                        self.long = coordinates?.longitude
                        self.lat = coordinates?.latitude
                      }
              }
         Text("\(long)")
         Text("\(lat)")
        }

    }
      func getLocation(from address: String, completion: @escaping (_ location: CLLocationCoordinate2D?)-> Void) {
          let geocoder = CLGeocoder()
          geocoder.geocodeAddressString(address) { (placemarks, error) in
              guard let placemarks = placemarks,
          let location = placemarks.first?.location?.coordinate else {
              completion(nil)
              return
        }
          completion(location)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Мои вопросы: как я должен вызывать эту функцию внутри моего файла содержимого, чтобы я мог сохранить координаты как переменные и как мне это сделать? вызовите функцию, чтобы распечатать их на экране, чтобы убедиться, что код работает правильно.

1 Ответ

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

Вы можете сделать это так в методе onAppear() очень простым способом. Тем не менее, я бы посоветовал вам использовать View Model для получения координат по адресу.

struct ContentView: View {
    @State var myText = "Some Text just for reference"
    @State var location: CLLocationCoordinate2D?
    var body: some View {
        Text(myText)
            .onAppear {
                self.getLocation(from: "Some Address") { coordinates in
                    print(coordinates) // Print here 
                    self.location = coordinates // Assign to a local variable for further processing
                }
        }
    }

    func getLocation(from address: String, completion: @escaping (_ location: CLLocationCoordinate2D?)-> Void) {
        let geocoder = CLGeocoder()
        geocoder.geocodeAddressString(address) { (placemarks, error) in
            guard let placemarks = placemarks,
            let location = placemarks.first?.location?.coordinate else {
                completion(nil)
                return
            }
            completion(location)
        }
    }
}
...