我只想搜索城市,但无法过滤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
返回位置的详细信息,但仅在用户完成输入并点击“搜索”按钮后才返回搜索词。