2016-05-24 6 views
2

EDIT Lösung: Wie ich vermutete reverseGeocodeLocation ist asynchron, also musste ich wartenWie kann ich die Daten von reverseGeocodeLocation in swift verwenden?

dispatch_async(
      dispatch_get_main_queue(), { 
       self.newAddress = address 
     }) 

Sie müssen auch verwenden, bis die newaddress Variable, es zu benutzen aktualisiert wird. Es gibt eine Verzögerung, aber es ist typische Zeit, etwa eine Sekunde.

ORIGINAL:

Ich versuche, den String aus CLGeocoder().reverseGeocodeLocation zu verwenden, um einem anderen Ansicht zu senden, wenn eine Anmerkung auf der Karte gedrückt wird. Der Handler existiert jedoch in einem Closure und dessen Void in. Ich habe versucht String in, aber das ist nicht mit dem Protokoll.

Gibt es eine Möglichkeit, die Daten von der Schließung zu verwenden?

-Code für Reverse Geocoding

func getReversedGeocodeLocation(){ 
    CLGeocoder().reverseGeocodeLocation(newMeetupLocation, completionHandler: {(placemarks, error) -> Void in 


     if error != nil { 
      print("Reverse geocoder failed with error" + error!.localizedDescription) 
      return 
     } 

     if placemarks != nil { 
      if placemarks!.count > 0 { 
       let pm = placemarks![0] 
       self.name = pm.name! + "-" + pm.thoroughfare! 
      } 

     } 
     else { 
      print("Problem with the data received from geocoder") 
     } 
    }) 
} 
+0

Können Sie mehr aus Ihrem Code schreiben? Versuchen Sie eine Zeichenfolge der Adresse zu senden? – chickenparm

+0

hat den Code hinzugefügt. Ich muss nur herausfinden, wie man Daten aus einer Schließung holt. Ich möchte die Zeichenfolge der Adresse verwenden können. – ggworean

Antwort

1

Ist das, was Sie erreichen wollen?

func getReversedGeocodeLocation(){ 
     CLGeocoder().reverseGeocodeLocation(newMeetupLocation, completionHandler: {(placemarks, error) -> Void in 


      if error != nil { 
       print("Reverse geocoder failed with error" + error!.localizedDescription) 
       return 
      } 

      if placemarks != nil { 
       if placemarks!.count > 0 { 
        let pm = placemarks![0] 
        let myAddress = pm.name! + "-" + pm.thoroughfare! 
        // just pass the address along, ie 
        self.newAddressFromGeocode(myAddress) 
       } 

      } 
      else { 
       print("Problem with the data received from geocoder") 
      } 
     }) 
    } 

    func newAddressFromGeocode(address:String) { 
     print(address) 
     // this is called from the completion handler 
     // do what you like here ie perform a segue and pass the string along 
    } 
0

Sie könnten so etwas wie dies versuchen:

// add a variable outside the function. Once this is filled with the address you can pass it in your prepareForSegue 
var addresssFromPlacemark = "" 

func getReversedGeocodeLocation(){ 
    CLGeocoder().reverseGeocodeLocation(newMeetupLocation, completionHandler: {(placemarks, error) -> Void in 


     if error != nil { 
      print("Reverse geocoder failed with error" + error!.localizedDescription) 
      return 
     } 

     if placemarks != nil { 
      if placemarks!.count > 0 { 
       let placemark = placemarks![0] 
       var line = "" 

       // Format placemark into a string 
       line.addText(placemark.name) 
       line.addText(placemark.subThoroughfare, withSeparator: ", ") 
       if placemark.subThoroughfare != nil { 
       line.addText(placemark.thoroughfare, withSeparator: " ") 
       } else { 
       line.addText(placemark.thoroughfare, withSeparator: ", ") 
       } 
       line.addText(placemark.locality, withSeparator: ", ") 
       line.addText(placemark.administrativeArea, withSeparator: ", ") 
       line.addText(placemark.postalCode, withSeparator: ", ") 
       line.addText(placemark.country, withSeparator: ", ") 
       self.addressFromPlacemark = line 
      } 

     } 
     else { 
      print("Problem with the data received from geocoder") 
     } 
    }) 
} 
+0

Ich habe versucht, eine Variable aus der Schließung zu ändern, aber es wird nicht aktualisiert. Irgendetwas damit zu tun, asynchron zu sein – ggworean

+0

Sind Sie sicher, dass der Code aufgerufen wird? Füge print ("Made this far") unter deinem Code hinzu pm = locemarks! [0] – chickenparm

+0

Ja, ich kann innerhalb der Schließung drucken, aber das ist so weit wie es geht. Selbst wenn ich die Methode des anderen Posters tue, wo ich eine Methode anrufe, wird sie nicht aktualisiert. – ggworean