I have the following function to determine the latitude/longitude of an address contained in a text field (searchAddress) to create a map region with this location as it's center and then add annotations firstly for this location and secondly for store locations that are stored in a Parse backend.
When the map view is first opened the searchAddress text field is preset with the users default address and the initial call to the function from viewDidLoad. It works as I had intended. However the user can then type a different address in this field and click a "Search" button which then also calls the same function and the second time. It works occasionally but generally does not display the annotations.
If I click "Search" again so the region does not change then the annotations are displayed correctly. I assume this is a timing issue and related to the time it takes to redraw the map when I change the region, as sometimes the annotations appear the first time but mostly they don't. And if I repeat the search without changing the address it works fine. Thanks in advance, I have been stuck on this and can't find a solution. Here's the code:
func addMapAnotations () {
// var searchLocation = preferredDeliveryLocation.text
var geocoder = CLGeocoder()
var address = CLLocationCoordinate2D()
geocoder.geocodeAddressString(searchAddress.text, completionHandler: {
(placemarks: [AnyObject]!, error: NSError!) -> Void in
if let placemark = placemarks?[0] as? CLPlacemark {
var latDelta: CLLocationDegrees = 0.1
var lonDelta: CLLocationDegrees = 0.1
var span: MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta)
address = placemark.location.coordinate
println(placemark.location.coordinate.latitude)
println("Inside geocoder lititude: \(address.latitude)")
println("Inside geocoder longitude: \(address.longitude)")
var location: CLLocationCoordinate2D = CLLocationCoordinate2DMake(address.latitude, address.longitude)
var region: MKCoordinateRegion = MKCoordinateRegionMake(location, span)
self.map.setRegion(region, animated: true)
var tempLocationObject = self.currentUser
var searchAnnotation = NewCustomPointAnnotation(coordinate: address, title: "", subtitle: "", locationObject: tempLocationObject!, locationCategory: "")
self.annotationCategory = "homeLocation"
searchAnnotation.locationCategory = "homeLocation"
searchAnnotation.coordinate = address
searchAnnotation.title = "Search address"
searchAnnotation.subtitle = "Search for delivery locations near by..."
// self.map.addAnnotation(MKPlacemark(placemark: placemark))
self.map.addAnnotation(searchAnnotation)
}
})
self.queryCurrent.whereKey("country", equalTo: "Australia")
// self.queryCurrent.whereKey("State", equalTo: state)
self.queryCurrent.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil {
if let objects = objects as? [PFObject] {
for object in objects {
println(object.objectId)
var latitude = object["latitude"] as! CLLocationDegrees
var longitude = object["longitude"] as! CLLocationDegrees
var location: CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude)
var deliveryAnnotation = NewCustomPointAnnotation(coordinate: location, title: "", subtitle: "", locationObject: object, locationCategory: "")
self.annotationCategory = "deliveryLocation"
deliveryAnnotation.locationCategory = "deliveryLocation"
deliveryAnnotation.coordinate = location
deliveryAnnotation.title = object["name"] as! String
deliveryAnnotation.subtitle = "Click to select this location"
deliveryAnnotation.locationObject = object
println("Annotation 1: \(deliveryAnnotation.description)")
println("Object ID: \(deliveryAnnotation.locationObject.objectId)")
self.map.addAnnotation(deliveryAnnotation)
}
}
} else {
println("No locations found")
}
}
}