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



我正在使用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)
}
}
}
}

在上面的代码中,如何将搜索到的位置名称、街道、pincode发送到其文本字段。。以便我们可以将其传递给JSON参数。

我可以在搜索到的好友中删除注释。。但是如何将其城市名称发送到其城市字段。。帮我处理代码。

您需要反向地理编码器,或者您可以使用googlemapapi发送坐标和获取地址,然后进行解析。这是一个地理编码器的例子

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
}

}

在您的情况下,只需将CLLocationCoordinate2D转换为CLLocation

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

然后调用函数

最新更新