如何制作 - 自动完成搜索全局而不是本地
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
【讨论】:
以上是关于如何制作 - 自动完成搜索全局而不是本地的主要内容,如果未能解决你的问题,请参考以下文章
如何使用javascript创建不自动完成的搜索来检查json文件中是不是存在内容