I am trying to give users the option to save their current location. I use the defaults to save it and I found out, how to get the users location. But I am not sure how to combine those two tasks. So here is my question:
How can I get my function to call users location, so it can be saved?
@IBAction func addLocation(_ sender: Any) {
// CALL LOCATION MANAGER TO GET LOCATION IN LAT AND LONG
self.saveDefaults()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return }
print("locations = \(locValue.latitude) \(locValue.longitude)")
}
func saveDefaults()
{
UserDefaults.standard.set(self.pickers, forKey: "pickers")
print("SAVED PICKERS: \(pickers)")
}
This is my most recent try but I don't know why my struct (lat: ,long:) is not taking the input
@IBAction func addLocation(_ sender: Any) {
var locations: [CLLocation]
let manager: CLLocationManager
let userLocation:CLLocation = locations[0] as CLLocation
// Call stopUpdatingLocation() to stop listening for location updates,
// other wise this function will be called every time when user location changes.
manager.stopUpdatingLocation()
print("user latitude = \(userLocation.coordinate.latitude)")
print("user longitude = \(userLocation.coordinate.longitude)")
self.pickers.append(pickerStruct(lat: userLocation.coordinate.latitude, long: userLocation.coordinate.longitude))
self.saveDefaults()
}
@IBAction func addLocation(_ sender: Any) {
locationManager.startUpdatingLocation() //This will call the delegate method below where you can save the location
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard locations.count > 0 else {
return
}
guard let location = locations.last else {
return
}
locationManager.stopUpdatingLocation() //Stop location updates after getting the location and save that location as below
let encodedLocation = NSKeyedArchiver.archivedData(withRootObject: location)
UserDefaults.standard.set(encodedLocation, forKey: "savedLocation")
}
To get back the location from UserDefaults:
let previousLocationEncoded = UserDefaults.standard.object(forKey: "savedLocation") as? Data
let previousLocationDecoded = NSKeyedUnarchiver.unarchiveObject(with: previousLocationEncoded!) as! CLLocation