MKLocalSearchCompleter

MKLocalSearchCompleter

我只想搜索城市,但无法过滤MKLocalSearchRequest / MKLocalSearch。我尝试了MKLocalSearchCompleter,但这并没有给我任何地标……仅是名称和字幕。有没有办法从MKLocalSearchCompleter获取地标?

我做了以下工作。但是我认为在didSelectRowAt indexPath中再次调用MKLocalSearchRequest并不是一个好习惯。但是我无法保存第一个结果并在didSelectRowAt中从此数组中获取正确的项目

var searchCompleter = MKLocalSearchCompleter()

var searchResults = [MKLocalSearchCompletion]()

extension SearchTableViewController : UISearchResultsUpdating {

public func updateSearchResults(for searchController: UISearchController) {

    guard let searchBarText = searchController.searchBar.text else { return }

    searchCompleter.queryFragment = searchBarText

    if searchCompleter.results.count > 0 {

        let searchRequest = MKLocalSearchRequest()

        let search = MKLocalSearch(request: searchRequest)
        search.start { (response, error) in }
    }
}
}
extension SearchTableViewController: MKLocalSearchCompleterDelegate {

func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
    searchResults = completer.results
    self.tableView.reloadData()
}

func completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error) {
    // handle error
}}

extension SearchTableViewController {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return searchResults.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "SearchCell")!
   // let selectedItem = matchingItems[indexPath.row]
    let searchResult = searchResults[indexPath.row]

    cell.textLabel?.text = searchResult.title
    cell.detailTextLabel?.text = searchResult.subtitle

    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath:IndexPath) {


    let searchRequest = MKLocalSearchRequest(completion: searchCompleter.results[indexPath.row])

    let search = MKLocalSearch(request: searchRequest)
    search.start { (response, error) in

        let placemark = response?.mapItems[0].placemark

        self.onSearchMapChanged?(placemark!.coordinate)
    }
}

}

最佳答案

我认为这就是Apple打算应用此“双重” API的方式。他们的方法减少了列表中返回的数据量。

这是该方法的clean implementation
MKLocalSearchCompleter使您可以“在用户点击时”为片段提供建议的完整术语。 MKLocalSearch返回位置的详细信息,但仅在用户完成输入并点击“搜索”按钮后才返回搜索词。

10-05 20:02