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 пуст.