How to implement auto-complete for address using Apple Map Kit

后端 未结 3 1179
孤独总比滥情好
孤独总比滥情好 2020-11-29 03:06

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

3条回答
  •  谎友^
    谎友^ (楼主)
    2020-11-29 03:50

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

提交回复
热议问题