如何制作 - 自动完成搜索全局而不是本地

Posted

技术标签:

【中文标题】如何制作 - 自动完成搜索全局而不是本地【英文标题】:How to make - Autocomplete search for global rather than local 【发布时间】:2018-10-08 09:23:28 【问题描述】:

我正在使用以下代码:

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 以及如何实现它。非常感谢您的帮助。

我得到这个: 虽然我需要这个:

【问题讨论】:

MKLocalSearchRequest 似乎有一个区域参数。你试过设置吗? @RakeshaShastri,没有。你能帮忙看看怎么做吗? 【参考方案1】:

我不是MapKit 方面的专家,但在阅读文档后,我觉得您可以通过在MKLocalSearchRequest 中设置region 参数来指定搜索区域。以下代码为官方docs中的示例。

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

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

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

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

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

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

【讨论】:

嘿@rakesha,看一下屏幕截图。我想在全球范围内搜索(伦敦、纽约、孟买都在搜索中)。这将在 myMapView 的区域中搜索,不是吗? @EnrikQaz 然后创建一个您希望搜索发生的坐标区域并传递该区域而不是地图区域? developer.apple.com/documentation/mapkit/mkcoordinateregion 但这对我来说似乎是糟糕的用户体验。 你没有明白我的意思。我不想通过保存其地图区域值来搜索特定位置。我想在全球范围内搜索任何查询的地区。 @EnrikQaz 您在搜索时是否可以看到地图? 不,它只是表格视图中的信息,您可以在问题详细信息中看到。【参考方案2】:

我遇到了同样的问题,我发现 MKLocalSearch.Request (https://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

【讨论】:

以上是关于如何制作 - 自动完成搜索全局而不是本地的主要内容,如果未能解决你的问题,请参考以下文章

jQuery UI 自动完成使用startsWith

限制 ajax 自动完成结果

如何使用javascript创建不自动完成的搜索来检查json文件中是不是存在内容

在自动完成本地搜索中集成分页

Jquery UI 自动完成。如何使用 innerHTML 在 div 中写入结果?

如何使 python 命令行程序自动完成任意事物而不是解释器