没有使用MKLocalSearchCompleter的地标

时间:2017-11-03 17:32:54

标签: ios swift mapkit

我想仅搜索城市,但无法过滤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)
    }
}

}

1 个答案:

答案 0 :(得分:1)

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

这里是方法的clean implementation

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