Как передать искомое имя местоположения в TextField в MKMapView в Swift? - PullRequest
0 голосов
/ 03 мая 2020

Я использую MKMapView для поиска местоположения. Я могу искать местоположение на карте, но здесь как отправить его Cityname and Street and pincode в соответствующие текстовые поля pincodeField , cityField, streetField.

этот код для поиска местоположения:

class RegistrationViewController1: UIViewController, CLLocationManagerDelegate, UISearchBarDelegate {

   @IBOutlet weak var pincodeField: UITextField!
@IBOutlet weak var cityField: UITextField!
@IBOutlet weak var streetField: UITextField!
let searchCont = UISearchController(searchResultsController: nil)

 override func viewDidLoad() {
 super.viewDidLoad()

 self.locationManager.requestAlwaysAuthorization()
 if CLLocationManager.locationServicesEnabled() {
 locationManager.delegate = self

 locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
 locationManager.startUpdatingLocation()
 }

    @IBAction func searchLocationButton(_ sender: Any) {
let searchCont = UISearchController(searchResultsController: nil)
searchCont.searchBar.delegate = self
searchCont.searchBar.backgroundColor = .blue
present(searchCont, animated:true, completion:nil)
}

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchBar.resignFirstResponder()
dismiss(animated: true, completion: nil)
//create the search request
let searchReq = MKLocalSearch.Request()
searchReq.naturalLanguageQuery = searchBar.text
let activeSearch = MKLocalSearch(request: searchReq)
activeSearch.start { (response, error) in
    UIApplication.shared.endIgnoringInteractionEvents()
    if response == nil{
        print("error")
    }
    else{

        let lat = response?.boundingRegion.center.latitude
        let long = response?.boundingRegion.center.longitude

        self.annotation.title = searchBar.text
        self.annotation.coordinate = CLLocationCoordinate2DMake(lat!, long!)
        self.mapView.addAnnotation(self.annotation)
        //zooming annotation
        let coordinate: CLLocationCoordinate2D = CLLocationCoordinate2DMake(lat!, long!)
        let span = MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)
        let region = MKCoordinateRegion(center: coordinate, span: span)
        self.mapView.setRegion(region, animated: true)
    }
}
}

}

в приведенном выше коде, как отправить имя искомого места, улицу, пин-код в его текстовое поле ... чтобы мы могли передать его в JSON Параметры.

Я могу удалить аннотацию в искомом месте .. но как отправить его название города в свой cityField .. помогите мне с кодом.

1 Ответ

0 голосов
/ 03 мая 2020

вам нужен обратный геокодер, или вы можете использовать Google Map API, чтобы отправить координаты и получить адрес, а затем проанализировать. Вот пример геокодера

CLGeocoder *geocoder = [CLGeocoder new];

CLLocation *newLocation = [[CLLocation alloc]initWithLatitude:21.1700
                                                    longitude:72.8300];

[geocoder reverseGeocodeLocation:newLocation
               completionHandler:^(NSArray *placemarks, NSError *error) {

                   if (error) {
                       NSLog(@"Geocode failed with error: %@", error);
                       return; // Request failed, log error
                   }

                   // Check if any placemarks were found                                                                    
                   if (placemarks && placemarks.count > 0)
                   {
                       CLPlacemark *placemark = placemarks[0];

                       // Dictionary containing address information
                       NSDictionary *addressDictionary =
                       placemark.addressDictionary;

                       // Extract address information
                       NSLog(@"%@ ", addressDictionary);
                       NSString *address = [addressDictionary
                                            objectForKey:(NSString *)kABPersonAddressStreetKey];
                       NSString *city = [addressDictionary
                                         objectForKey:(NSString *)kABPersonAddressCityKey];
                       NSString *state = [addressDictionary
                                          objectForKey:(NSString *)kABPersonAddressStateKey];
                       NSString *zip = [addressDictionary 
                                        objectForKey:(NSString *)kABPersonAddressZIPKey];


                       NSLog(@"%@ %@ %@ %@", address,city, state, zip);
                   }

               }];

ОБНОВЛЕНИЕ: ваш код быстро попробуйте

Предположим, у вас есть

var currentLocation : CLLocation!

Используйте это удовольствие c, чтобы получить адрес

    func getAdress(completion: @escaping (_ address: String?, _ error: Error?) -> ()){
            let geoCoder = CLGeocoder()
            geoCoder.reverseGeocodeLocation(self.currentLocation) { placemarks, error in

                if let e = error{
                    completion(nil, e)
                } else {
                    let placeArray = placemarks
                    var placemark: CLPlacemark!
                    placemark = placeArray?[0]
//                    guard let address = placemark.addressDictionary as? JSONDictionary else {
//                        return
//                    }
                    let street = placemark.thoroughfare != nil ? placemark.thoroughfare!  : ""
                    let city =  placemark.subAdministrativeArea != nil  ?  placemark.subAdministrativeArea! : ""
                    let state = placemark.administrativeArea != nil ? placemark.administrativeArea! : ""
                    let zip =  placemark.isoCountryCode != nil ? placemark.administrativeArea! : ""
                    let country = placemark.country != nil ? placemark.administrativeArea! : ""
//
                    let address = "\(street) \(city) \(state)  \(zip) \(country) "
                    completion(address, nil)
                }
            }
        }

используется

if self.currentLocation != nil {
            self.getAdress { (jsonDict, error) in
                if error != nil {
                    return
                } else {
                    //let classObj = LocationOrganizer(jsonDict: jsonDict!)
                    let classObj = LocationOrganizer(str: jsonDict!)

                    print(classObj)
                }
            }
        }

и класс LocationOrganizer:

class LocationOrganizer {
    var locationString : String!

    init(str: String) {
         self.locationString = str
     }


}

, и в вашей ситуации просто конвертируйте CLLocationCoordinate2D в CLLocation

let currentLocation = CLLocation(latitude: lat, longitude: long)

тогда вызывай веселье c

...