如何在Swift中将搜索到的位置名称传递给MKMapView中的TextField?

问题描述 投票:0回答:1

我正在使用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 ..用代码帮助我。

swift location uitextfield mkmapview
1个回答
0
投票
您需要反向地理编码器,或者您可以使用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!

使用此功能获取地址

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 } }

© www.soinside.com 2019 - 2024. All rights reserved.