2

我正在使用以下代码:

class SearchViewController: UIViewController {

    var searchCompleter = MKLocalSearchCompleter()
    var searchResults = [MKLocalSearchCompletion]()

    @IBOutlet weak var searchResultsTableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        searchCompleter.delegate = self
    }
}

extension SearchViewController: UISearchBarDelegate {
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        searchCompleter.queryFragment = searchText
    }
}

extension SearchViewController: MKLocalSearchCompleterDelegate {

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

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

extension SearchViewController: UITableViewDataSource {

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> 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
    }
}

extension SearchViewController: UITableViewDelegate {

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)

        let completion = searchResults[indexPath.row]

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

但是,这只搜索本地而不是全局。如何对全局数据进行自动完成搜索?我无法获得是否有适用于 iOS 的 api 以及如何实现它。非常感谢您的帮助。

我得到了这个: 在此处输入图像描述 虽然我需要这个: 在此处输入图像描述

4

2 回答 2

1

我不是. MapKit_ 以下代码是官方文档中的示例。regionMKLocalSearchRequest

指定搜索字符串时,请包含地图区域以将搜索结果缩小到指定的地理区域。

let request = MKLocalSearchRequest()
request.naturalLanguageQuery = "coffee"

// Set the region to an associated map view's region
request.region = myMapView.region

myMapView.region是你的可见区域MKMapView。因此,如果您获得本地结果,可能是因为您的地图在该区域被放大。

但是,如果您在地图的可见区域之外显示结果,那么这似乎是糟糕的 UX,因为用户期望在他可见的区域中得到结果。查看当前地图应用程序做了什么。它们首先显示在可见区域内的结果,然后是其他区域。这似乎是因为他们在文档的最后一行中所说的话。

指定区域并不能保证结果都在该区域内。这只是对搜索引擎的提示。

于 2018-10-08T09:37:55.573 回答
0

我遇到了同样的问题,我发现MKLocalSearch.Requesthttps://developer.apple.com/documentation/mapkit/mklocalsearch/request)对于全局搜索比MKLocalSearchCompletion. 您只需确保将该区域设置为默认区域,根据 Apple 的说法,该区域是全球 ( https://developer.apple.com/documentation/mapkit/mklocalsearchcompleter/1451923-region ):

使用此属性将搜索结果限制在指定的地理区域。此属性的默认值是跨越整个世界的区域。

可以按如下方式完成:

let request = MKLocalSearch.Request()
request.region = MKCoordinateRegion()

request.naturalLanguageQuery = query
let search = MKLocalSearch(request: request)
  
search.start { response, error in
  guard let response = response else {
    return
   }
    
  self.predictions = response.mapItems
}
于 2022-02-04T16:36:25.823 回答