如何使用Apple Map Kit实现地址的自动填写

我想自动完成用户的地址,就像google api在这个链接中提供的一样:

https://developers.google.com/maps/documentation/javascript/places-autocomplete?hl=en

我如何使用苹果地图工具包实现相同的function?

我试图使用地理编码器,我写这个例如:

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

但结果非常令人失望。

任何苹果API可用于实现这样的function,或者我应该头谷歌API?

谢谢

更新 – 我已经使用Swift 3创build了一个简单的示例项目,原来的答案是在Swift 2中编写的。

在iOS 9.3中引入了一个名为MKLocalSearchCompleter的新类,它允许创build自动完成解决scheme,只需传入queryFragment即可:

 var searchCompleter = MKLocalSearchCompleter() searchCompleter.delegate = self var searchResults = [MKLocalSearchCompletion]() searchCompleter.queryFragment = searchField.text! 

然后使用MKLocalSearchCompleterDelegate处理查询的结果:

 extension SearchViewController: MKLocalSearchCompleterDelegate { func completerDidUpdateResults(completer: MKLocalSearchCompleter) { searchResults = completer.results searchResultsTableView.reloadData() } func completer(completer: MKLocalSearchCompleter, didFailWithError error: NSError) { // handle error } } 

并以适当的格式显示地址结果:

 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 } 

然后可以使用MKLocalCompletion对象来实例化MKLocalSearchRequest ,从而获得对MKPlacemark和所有其他有用数据的访问:

 let searchRequest = MKLocalSearchRequest(completion: completion!) let search = MKLocalSearch(request: searchRequest) search.startWithCompletionHandler { (response, error) in let coordinate = response?.mapItems[0].placemark.coordinate } 

我的答案完全基于@乔治麦克唐纳的。 希望对那些在执行最后一个时遇到麻烦的人有所帮助。

 import UIKit import MapKit class ViewController: UIViewController { @IBOutlet weak var searchBar: UISearchBar! @IBOutlet weak var tableVIew: UITableView! //create a completer lazy var searchCompleter: MKLocalSearchCompleter = { let sC = MKLocalSearchCompleter() sC.delegate = self return sC }() var searchSource: [String]? } extension ViewController: UISearchBarDelegate { func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { //change searchCompleter depends on searchBar's text if !searchText.isEmpty { searchCompleter.queryFragment = searchText } } } extension ViewController: UITableViewDelegate, UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return searchSource?.count ?? 0 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { //I've created SearchCell beforehand; it might be your cell type let cell = self.tableVIew.dequeueReusableCell(withIdentifier: "SearchCell", for: indexPath) as! SearchCell cell.label.text = self.searchSource?[indexPath.row] // + " " + searchResult.subtitle return cell } } extension ViewController: MKLocalSearchCompleterDelegate { func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) { //get result, transform it to our needs and fill our dataSource self.searchSource = completer.results.map { $0.title } DispatchQueue.main.async { self.tableVIew.reloadData() } } func completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error) { //handle the error print(error.localizedDescription) } } 

你一定要去Google API。 我一直在用苹果的地理编码API挣扎了很长时间,我可以向你保证它们的质量非常有限。

如果你想看到如此低质量的最明显的例子,请检查我的这个问题。

借助Google的API,您可以获得更加准确的结果。 另外,他们有自动完成API。 你可以在这里find更多关于他们的信息 。

我已经尝试过,并设法使它们工作得很好。