I want to auto-complete the address for the user as same as what google api provides in this link:
https://developers.google.com/maps/documentation/javascript/places-autocomplete?hl=en
How can i implement the same functionality using apple map kit?
I have tried to use the Geo Coder, i wrote this for example:
@IBAction func SubmitGeoCode(sender: AnyObject) { let address = "1 Mart" let coder = CLGeocoder() coder.geocodeAddressString(address) { (placemarks, error) -> Void in for placemark in placemarks! { let lines = placemark.addressDictionary?["FormattedAddressLines"] as? [String] for addressline in lines! { print(addressline) } } } }
However the results are very disappointing.
Any Apple APIs available to implement such functionality, or should i head for google api ?
Thank you
You create an MKLocalSearch. Request object when you want to search for map locations based on a natural language string. For example, if your interface allows the user to type in addresses, you would place the typed text in this object and pass it to an MKLocalSearch object to begin the search process.
MapKit is a powerful API available on iOS devices that makes it easy to display maps, mark locations, enhance with custom data and even draw routes or other shapes on top.
Update - I've created a simple example project here using Swift 3 as the original answer was written in Swift 2.
In iOS 9.3 a new class called MKLocalSearchCompleter
was introduced, this allows the creation of an autocomplete solution, you simply pass in the queryFragment as below:
var searchCompleter = MKLocalSearchCompleter() searchCompleter.delegate = self var searchResults = [MKLocalSearchCompletion]() searchCompleter.queryFragment = searchField.text!
Then handle the results of the query using the MKLocalSearchCompleterDelegate
:
extension SearchViewController: MKLocalSearchCompleterDelegate { func completerDidUpdateResults(completer: MKLocalSearchCompleter) { searchResults = completer.results searchResultsTableView.reloadData() } func completer(completer: MKLocalSearchCompleter, didFailWithError error: NSError) { // handle error } }
And display the address results in an appropriate format:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let searchResult = searchResults[indexPath.row] let cell = UITableViewCell(style: .subtitle, reuseIdentifier: nil) cell.textLabel?.text = searchResult.title cell.detailTextLabel?.text = searchResult.subtitle return cell }
You can then use a MKLocalCompletion
object to instantiate a MKLocalSearch.Request
, thus gaining access to the MKPlacemark
and all other useful data:
let searchRequest = MKLocalSearch.Request(completion: completion!) let search = MKLocalSearch(request: searchRequest) search.startWithCompletionHandler { (response, error) in if error == nil { let coordinate = response?.mapItems[0].placemark.coordinate } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With