В geocodeAddressString
работает асинхронно (т.е. даже если метод возвращается немедленно, его закрытие completionHandler
может быть вызвано позже). Итак, вы уверены, что он не меняется или просто не меняется к тому времени, когда вы пытаетесь использовать chooseCoordinates
? Вы должны инициировать любое обновление пользовательского интерфейса или что-либо из него в закрытии (или didSet
от chooseCoordinates
), не делая этого немедленно. Мы не видим, как вы используете chooseCoordinates
, поэтому трудно быть более конкретным.
Например:
geocoder.geocodeAddressString(sender.text!) { placemarks, error in
if error != nil {
print(error!)
}
if let placemark = placemarks?.first {
let coordinates: CLLocationCoordinate2D = placemark.location!.coordinate
self.chooseCoordinates = coordinates
// call the method that uses `chooseCoordinates` here
}
}
// don't try to use `chooseCoordinates` here, as it hasn't been set yet.
Или, вы можете использовать в completionHandler
шаблон себя:
@IBAction func didEndEditingTextField(sender: UITextField) {
geocodeAddressString(sender.text!) { coordinate, error in
self.chooseCoordinates = coordinate
// trigger whatever the next step is here, or in the `didSet` of `chooseCoordinates`
}
// don't try to use `chooseCooordinates` here
}
var chooseCoordinates: CLLocationCoordinate2D? // you probably should make this optional
let geocoder = CLGeocoder()
/// Geocode string
///
/// - parameter string: The string to geocode.
/// - parameter completionHandler: The closure that is called asynchronously (i.e. later) when the geocoding is done.
func geocodeAddressString(string: String, completionHandler: (CLLocationCoordinate2D?, NSError?) ->()) {
geocoder.geocodeAddressString(string) { placemarks, error in
if error != nil {
print(error!)
}
if let placemark = placemarks?.first {
completionHandler(placemark.location!.coordinate, error)
} else {
completionHandler(nil, error)
}
}
}
Спасибо! Я использовал первый в своем другом контроллере представления, и он работал, поэтому речь шла о синхронизации. –